Udostępnij za pośrednictwem


Windows Sockets: blokowanie

W tym artykule oraz dwa artykuły Pomocnik wyjaśnić kilka problemów podczas programowania Windows Sockets.Ten artykuł obejmuje blokowanie.Inne zagadnienia zostały omówione w artykułach: Windows Sockets: bajtów to i Windows Sockets: Konwertowanie ciągów.

Jeśli używasz lub pochodzić od klasy CAsyncSocket, musisz samodzielnie zarządzać tych problemów.Jeśli używasz lub pochodzić od klasy CSocketFile, CSocket, MFC zarządza je dla Ciebie.

Blokowanie

Gniazda mogą znajdować się w "trybu blokowania" lub "trybie nieblokująca." Gniazd w trybie blokowania (lub synchroniczne) nie zwracają dopóki nie są możliwe do wykonania swoich akcji.Jest to tak zwane blokowanie, ponieważ nie można nic zrobić gniazda, których funkcja została wywołana — jest zablokowany — aż do momentu powrotu wywołanie.Wywołanie Odbierz funkcji członka, na przykład może trwać dowolnie długo do ukończenia, jak też czeka aplikacji wysyłającej wysyłanie (to jest, jeśli używasz CSocket, lub za pomocą CAsyncSocket z blokowania).Jeśli CAsyncSocket obiekt znajduje się w trybie nieblokująca (asynchronicznie operacyjna), wywołanie zwraca niezwłocznie i bieżący kod błędu, można jej pobrać z GetLastError funkcji członka jest WSAEWOULDBLOCK, wskazując, że połączenie będzie zablokowane, gdyby nie zwracane natychmiast, ze względu na sposób. (CSocket nigdy nie zwraca WSAEWOULDBLOCK.Klasa zarządza blokowanie automatycznie.)

Zachowanie gniazd różni się w 32-bitowych i 64-bitowych systemach operacyjnych (na przykład Windows 95 lub Windows 98) niż w 16-bitowych systemach operacyjnych (na przykład Windows 3.1).W przeciwieństwie do 16-bitowych systemach operacyjnych 32-bitowy i 64-bitowych systemów operacyjnych użyć cenią sobie wcześniejsze wielozadaniowość i zapewnić wielowątkowości.W 32-bitowych i 64-bitowych systemach operacyjnych można umieścić w oddzielnych wątków z gniazda.Gniazdo w wątku można zablokować nie kolidowało z innymi działaniami w aplikacji i spędzają czas obliczeń na blokowanie.O programowanie wielowątkowe, zobacz artykuł wielowątkowość.

[!UWAGA]

W aplikacjach wielowątkowych, można użyć blokowania charakter CSocket Uproszczenie projektowania programu bez wpływu na czas reakcji interfejsu użytkownika.Manipulując interakcji użytkownika w głównym wątku i CSocket przetwarzania w alternatywnej wątków, można je oddzielić te operacje logiczne.W aplikacji, która nie jest wielowątkowe, te dwa działania musi być połączone i traktowane jako pojedynczy wątek, co zwykle oznacza za pomocą CAsyncSocket więc może obsłużyć żądania komunikacji na żądanie lub przesłanianie CSocket::OnMessagePending do obsługi akcji użytkownika podczas długiego synchronicznych aktywności.

Pozostała część tej dyskusji jest dla programistów kierowania 16-bitowych systemach operacyjnych:

Normalnie korzystając z CAsyncSocket, należy unikać blokowania operacji i zamiast asynchronicznie.W operacji asynchronicznych od punktu, w którym pojawi się WSAEWOULDBLOCK kod błędu po wywołaniu Odbierz, na przykład czekać aż do swojej OnReceive funkcji składowej nazywa się powiadomić, że można ponownie przeczytać.Wywołania asynchroniczne są wykonywane przez oddzwanianie socket's odpowiednie wywołania zwrotnego powiadomienia funkcji, takich jak OnReceive.

W systemie Windows połączenia blokującego są uważane za złych praktyk.Domyślnie CAsyncSocket obsługuje wywołania asynchroniczne, a trzeba zarządzać blokowanie siebie za pomocą wywołania zwrotnego powiadomienia.Klasa CSocketFile, CSocket, z drugiej strony, jest synchroniczna.To pompy komunikatów systemu Windows i zarządza blokowania dla Ciebie.

Aby uzyskać więcej informacji o blokowaniu Zobacz Specyfikacja usługi Windows Sockets.Aby uzyskać więcej informacji na temat "funkcji na" zobacz Windows Sockets: gniazdo powiadomienia o i Windows Sockets: wynikające z klas Socket.

Aby uzyskać więcej informacji, zobacz:

Zobacz też

Informacje

CAsyncSocket::OnSend

Koncepcje

Windows Sockets w MFC