Επικαλυπτόμενη υποδοχή I/O έναντι αποκλεισμού/μη αποκλεισμού λειτουργία

Σύνοψη

Αυτό το άρθρο εξηγεί τη διαφορά ανάμεσα στο επικαλυπτόμενο χαρακτηριστικό I/O μιας υποδοχής και τη λειτουργία αποκλεισμού ή μη αποκλεισμού της υποδοχής.

Περισσότερες πληροφορίες

Όταν δημιουργείται μια υποδοχή, από προεπιλογή είναι μια υποδοχή αποκλεισμού. Μπορείτε να χρησιμοποιήσετε την εντολή FIONBIO στην τοπική κλήση API, την επιλογή wsyyfysor ή WSAAysncSelect για να αλλάξετε τη λειτουργία υποδοχής από τον αποκλεισμό σε μη αποκλεισμό. Εάν μια κλήση Winsock δεν μπορεί να ολοκληρωθεί αμέσως, η κλήση αποτυγχάνει και Wsagetlasterρορ επιστρέφει ένα σφάλμα WSAGETLASTERROR, εάν είναι μια υποδοχή χωρίς αποκλεισμό, ή το μπλοκ κλήσης μέχρι να ολοκληρωθεί η λειτουργία, εάν είναι μια υποδοχή αποκλεισμού. Το χαρακτηριστικό I/O επικαλυπτόμενης υποδοχής είναι διαφορετικό από τη λειτουργία αποκλεισμού ή μη αποκλεισμού της υποδοχής. Αν και η τρέχουσα εφαρμογή Winsock απαιτεί επικαλυπτόμενο χαρακτηριστικό I/O για λειτουργία υποδοχής χωρίς αποκλεισμό, είναι εννοιολογικά ανεξάρτητο και το μοντέλο προγραμματισμού τους είναι επίσης διαφορετικό. Για να δημιουργήσετε μια υποδοχή με το χαρακτηριστικό επικάλυψης I/O, μπορείτε είτε να χρησιμοποιήσετε το API υποδοχής ή το API WSASocket με το σύνολο σημαίας WSA_FLAG_OVERLAPPED. Εάν μια επικαλυπτόμενη λειτουργία I/O δεν μπορεί να ολοκληρωθεί αμέσως, η κλήση αποτυγχάνει και Wsagetlasterρορ ή Getlasterρορ επιστροφή WSA_IO_PENDING ή ERROR_IO_PENDING, η οποία είναι στην πραγματικότητα ο ίδιος Ορισμός ως WSA_IO_PENDING. Για πρόσθετες πληροφορίες, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft:

179942 ΠΛΗΡΟΦΟΡΊΕς: WSA_FLAG_OVERLAPPED απαιτείται για τις μη μπλοκάροντας πρίζεςΣημειώστε ότι μόλις δημιουργηθεί μια υποδοχή, δεν υπάρχει τρόπος για να αλλάξετε το χαρακτηριστικό επικαλυπτόμενη υποδοχή. Ωστόσο, μπορείτε να καλέσετε το API Set-opt με SO_OPENTYPE σε οποιαδήποτε λαβές υποδοχή, συμπεριλαμβανομένου ενός INVALID_SOCKET για να αλλάξετε τα χαρακτηριστικά επικαλυπτόμενων για όλες τις διαδοχικές κλήσεις υποδοχή στο ίδιο νήμα. Η προεπιλεγμένη τιμή της επιλογής SO_OPENTYPE είναι 0, η οποία ορίζει το χαρακτηριστικό επικαλυπτόμενο. Όλες οι μη μηδενικές τιμές επιλογής κάνουν την υποδοχή σύγχρονη και την καθιστούν έτσι ώστε να μην μπορείτε να χρησιμοποιήσετε μια λειτουργία ολοκλήρωσης. Ορίζοντας επικαλυπτόμενο χαρακτηριστικό I/O μιας υποδοχής, αυτό δεν σημαίνει ότι η υποδοχή θα εκτελέσει μια επικαλυπτόμενη λειτουργία I/O. Για παράδειγμα, εάν καθορίσετε την τιμή null τόσο για τη λειτουργία ολοκλήρωσης όσο και για την επικαλυπτόμενη δομή στο WSARecv και το WSASend, ή απλά καλέστε λήψη ή αποστολή συναρτήσεων, θα ολοκληρωθούν με έναν τρόπο αποκλεισμού. Για να βεβαιωθείτε ότι η I/O εκτελείται σε μια επικάλυψη μόδας θα πρέπει να παρέχουν μια επικαλυπτόμενη δομή στη λειτουργία I/O σας, ανάλογα με τη λειτουργία που χρησιμοποιείτε.

Επικαλυπτόμενη I/O

Στο Winsock 1, μπορείτε να δημιουργήσετε μια επικαλυπτόμενη υποδοχή χρησιμοποιώντας το API υποδοχής, και χρησιμοποιήστε Win32 αρχείο I/O API ανάγνωσης, ανάγνωση αρχείω_αρχείου, εγγράψιμο αρχείο, εγγράψιμο Αρχείωex για να εκτελέσετε επικαλυπτόμενη I/O στη λαβή υποδοχής. Στο Winsock 2, μπορείτε να δημιουργήσετε μια επικαλυπτόμενη υποδοχή χρησιμοποιώντας WSASocket με τη σημαία WSA_FLAG_OVERLAPPED, ή απλά χρησιμοποιώντας το API υποδοχής. Μπορείτε να χρησιμοποιήσετε τα παραπάνω API I/O αρχείων Win32 ή Winsock 2 WSASend, WSASendTo, WSARecv και Wsarecvof για να ξεκινήσει μια επικαλυπτόμενη λειτουργία I/O. Εάν χρησιμοποιείτε την επιλογή SO_RCVBUF και SO_SNDBUF για να ορίσετε μηδενική στοίβα TCP λήψη και αποστολή buffer, μπορείτε βασικά να αναθέσει τη στοίβα TCP για να εκτελέσει απευθείας I/O χρησιμοποιώντας το buffer που παρέχεται στην κλήση σας I/O. Επομένως, εκτός από το πλεονέκτημα μη αποκλεισμού της επικαλυπτόμενης υποδοχής I/O, το άλλο πλεονέκτημα είναι καλύτερη απόδοση, επειδή αποθηκεύετε ένα buffer αντίγραφο μεταξύ του buffer στοίβας TCP και το buffer χρήστη για κάθε κλήση I/O. Αλλά πρέπει να βεβαιωθείτε ότι δεν έχετε πρόσβαση στο buffer χρήστη μόλις υποβληθεί για επικαλυπτόμενη λειτουργία και πριν από την ολοκλήρωση της επικαλυπτόμενης λειτουργίας. Για να εξακριβώσετε αν έχει ολοκληρωθεί η επικαλυπτόμενη λειτουργία I/O, μπορείτε να χρησιμοποιήσετε μία από τις ακόλουθες επιλογές:

  • Μπορείτε να παρέχετε μια λαβή συμβάντος σε μια επικαλυπτόμενη δομή που χρησιμοποιείται στην κλήση I/O και περιμένετε στη λαβή συμβάντος για να σήμα.

  • Χρησιμοποιήστε το GetOverlappedResult ή το WSAGetOverlappedResult για να σταθμοσκοπείτε στην κατάσταση της επικαλυπτόμενης λειτουργίας I/O. Στα Windows NT, μπορείτε να καθορίσετε την τιμή NULL ως λαβή συμβάντος στην επικαλυπτόμενη δομή. Ωστόσο, στα Windows 95, η επικαλυπτόμενη δομή πρέπει να περιέχει ένα μη αυτόματη επαναφορά δείκτη χειρισμού συμβάντων. WSAGetOverlappedResult σε Windows 98 και Windows Millennium Edition (ME) τροποποιείται έτσι ώστε να συμπεριφέρεται όπως τα Windows NT και μπορεί επίσης να σφυγμομέτρηση της κατάστασης ολοκλήρωσης με μια λαβή συμβάντος NULL στη δομή επικαλυπτόμενη.

  • Χρησιμοποιήστε την επιλογή "ανάγνωση αρχείου", "εγγράψιμο αρχείο", "WSARecv", Wsarecvof, WSASend ή WSARecv και επιλέξτε να παρέχετε μια λειτουργία ολοκλήρωσης που θα καλείται όταν ολοκληρωθεί η επικαλυπτόμενη λειτουργία I/O. Εάν χρησιμοποιείτε την προσέγγιση λειτουργία ολοκλήρωσης, σε κάποιο σημείο μετά την έκδοση της επικαλυπτόμενης λειτουργίας I/O θα πρέπει να εκδώσει μια λειτουργία αναμονής Win32 ή μια έκδοση WSA της λειτουργίας αναμονής για να περιμένετε σε μια μη σηματοδοτηθεί λαβή για να τοποθετήσετε το τρέχον νήμα σε κατάσταση αναμονής. Όταν ολοκληρώνεται η επικαλυπτόμενη λειτουργία I/O, καλείται η λειτουργία ολοκλήρωσής σας, η λειτουργία αναμονής σας θα επιστρέψει WAIT_IO_COMPLETION και το νήμα αναμονής για την αναμονή θα ξυπνήσει.

  • Χρήση ___________________________________________________ Με το τοπικό πλαίσιο, δεν χρειάζεται να παρέχετε μια λειτουργία ολοκλήρωσης, να περιμένετε σε μια λαβή συμβάντος για να δώσετε σήμα ή να σταθμοσκοπείτε στην κατάσταση της επικαλυπτόμενης λειτουργίας. Μόλις δημιουργήσετε το τοπι και προσθέστε τη λαβή επικαλυπτόμενης υποδοχή σας στο τοπικό, μπορείτε να ξεκινήσετε την επικαλυπτόμενη λειτουργία, χρησιμοποιώντας οποιοδήποτε από τα API I/O που αναφέρονται παραπάνω (εκτός από recv, recvof, αποστολή ή SendTo). Θα έχετε το μπλοκ νήματος εργασίας σας σε Getpesedpes_________________θέσης Όταν ολοκληρωθεί μια επικαλυπτόμενη I/O, ένα πακέτο ολοκλήρωσης I/O φθάνει στην κατάσταση και επιστροφές κατάστασης Το σύστημα είναι η υποστήριξη του λειτουργικού συστήματος των Windows NT για την εγγραφή ενός διακομιστή υψηλής απόδοσης με δυνατότητα κλιμάκωσης, χρησιμοποιώντας πολύ απλές σπειρώματα και κώδικα φραγής σε επικαλυπτόμενες λειτουργίες I/O. Έτσι, μπορεί να υπάρχει ένα σημαντικό πλεονέκτημα απόδοσης της χρήσης επικαλυπτόμενη υποδοχή I/O με τα Windows NT παράθυρα.

Λειτουργία φραγής και μη αποκλεισμού

Όταν δημιουργείται μια υποδοχή, από προεπιλογή είναι μια υποδοχή αποκλεισμού. Κάτω από τις λειτουργίες κλειδώματος υποδοχής λειτουργίας σύνδεσης, συνδεθείτε και αποδεχτείτε όλες τις λειτουργίες του μπλοκ μέχρι να ολοκληρωθεί η εν λόγω λειτουργία. Για να αλλάξετε τη λειτουργία υποδοχής από τη λειτουργία αποκλεισμού σε κατάσταση λειτουργίας χωρίς αποκλεισμό, μπορείτε είτε να χρησιμοποιήσετε το WSAAsyncSelect, WSA/Select, ή την εντολή FIONBIO στην τοπική κλήση API. Wsaασύγχρονη Cselect αντιστοιχίζει ειδοποιήσεις υποδοχή σε μηνύματα των Windows και είναι το καλύτερο μοντέλο για μια μεμονωμένη εφαρμογή με σπείρωμα GUI. Η επιλογή Wsaevent Select χρησιμοποιεί WSAEventSelect συμβάντα για να προσδιορίσει τη φύση της ειδοποίησης υποδοχής στο συμβάν σηματοδότησης και τις ειδοποιήσεις υποδοχών με σηματοδότηση ενός συμβάντος. Αυτό είναι ένα χρήσιμο μοντέλο για εφαρμογές που δεν είναι GUI που στερούνται μιας αντλίας μηνυμάτων, όπως μια εφαρμογή υπηρεσίας των Windows NT. Η εντολή FIONBIO στην τοπική κλήση API τοποθετεί την υποδοχή σε λειτουργία μη αποκλεισμού, καθώς και. Αλλά θα πρέπει να σταθμοσκοπήσει την κατάσταση της υποδοχής, χρησιμοποιώντας το Επιλέξτε API. Ενημερωμένη έκδοση: ρύθμιση SO_RCVBUF σε μηδέν με επικαλυπτόμενο λήψη δεν είναι απαραίτητο για τα Windows 2000, η οποία μπορεί να αντιγράψει άμεσα τα δεδομένα στο buffer λήψη της εφαρμογής. Ρύθμιση SO_SNDBUF σε μηδέν με επικαλυπτόμενη αποστολή σε Windows 2000 εξακολουθεί να έχει το ίδιο όφελος από την αποθήκευση ενός αντιγράφου μνήμης, όπως στα Windows NT 4,0. Είναι επίσης σημαντικό ότι η εφαρμογή εκδίδει αρκετές εκκρεμείς επικαλυπτόμενες αποστολή ή recv, εάν η εφαρμογή ορίζει το αντίστοιχο buffer στοίβας σε 0.

Χρειάζεστε περισσότερη βοήθεια;

Αναπτύξτε τις δεξιότητές σας
Εξερευνήστε το περιεχόμενο της εκπαίδευσης
Αποκτήστε πρώτοι τις νέες δυνατότητες
Συμμετοχή στο Microsoft Insider

Σας βοήθησαν αυτές οι πληροφορίες;

Σας ευχαριστούμε για τα σχόλιά σας!

Σας ευχαριστούμε για τα σχόλιά σας! Φαίνεται ότι μπορεί να είναι χρήσιμο να συνδεθείτε με έναν από τους συνεργάτες υποστήριξης του Office.

×