Windows Sockets: blokowanie
W tym artykule i dwa artykuły companion wyjaśnić kilka problemów programowania Windows Sockets.W tym artykule omówiono blokowania.Inne kwestie objęte są w artykułach: Windows Sockets: kolejność bajtów i Windows Sockets: Konwertowanie ciągów.
Jeśli jest używany lub pochodzić od klasy CAsyncSocket, musisz samodzielnie zarządzać tych problemów.Jeśli jest używany lub pochodzić od klasy CSocket, MFC zarządza je dla Ciebie.
Blokowanie
Gniazda mogą znajdować się w "trybie blokowania" lub "Tryb nieblokujących". Funkcje gniazd w trybie blokowania (lub synchroniczne) nie zwracają, dopóki im wykonywanie ich działania.Jest to tak zwane blokowanie, ponieważ nie można nic zrobić gniazda, z którego funkcja została wywołana — jest zablokowany — dopóki zwraca wywołanie.Wywołanie odbioru na przykład funkcji składowej może trwać dowolnie długo do ukończenia w oczekiwaniu aplikacji wysyłającej wysyłanie (Jeśli używany jest CSocket, lub za pomocą CAsyncSocket z blokowaniem).Jeśli CAsyncSocket obiekt jest w trybie nieblokujących (operacyjna asynchronicznie), wywołanie zwraca niezwłocznie i bieżący kod błędu, można odzyskać z GetLastError jest funkcja składnika, WSAEWOULDBLOCK, wskazując połączenie będzie mieć zablokowane miał on nie zwracane natychmiast, ze względu na tryb.(CSocket nigdy nie zwraca WSAEWOULDBLOCK.Klasa zarządza blokowania dla Ciebie.)
Zachowanie gniazd jest inny 32-bitowy i 64-bitowych systemach operacyjnych (takich jak Windows 95 lub Windows 98) niż 16-bitowych systemach operacyjnych (takich jak Windows 3.1).W przeciwieństwie do 16-bitowych systemach operacyjnych 32-bitowe i 64-bitowych systemów operacyjnych użyć wielozadaniowość z wywłaszczaniem i dostarczyć wielowątkowości.32-Bitowe i 64-bitowych w systemach operacyjnych sockets użytkownika można umieścić w oddzielnych wątków.Bez naruszania innych działań w aplikacji i nie tracąc czasu compute na blokowanie, można zablokować gniazda w wątku.Aby uzyskać informacje dotyczące programowania wielowątkowego, zobacz artykuł Multithreading.
[!UWAGA]
W aplikacjach wielowątkowych, można użyć blokowania charakter CSocket Uproszczenie projektowania programu bez wpływu na czas reakcji interfejsu użytkownika.Poprzez obsługę interakcji użytkownika w głównym wątku i CSocket przetwarzania w alternatywnej wątków, można oddzielić te operacje logiczne.W aplikacji, która nie jest wielowątkowe, działania te dwa musi połączone i traktowane jako pojedynczy wątek, co zwykle oznacza za pomocą CAsyncSocket tak może obsłużyć żądania komunikacji na żądanie lub przesłanianie CSocket::OnMessagePending do obsługi akcji użytkownika podczas długiego działania synchronicznych.
Pozostała część tej dyskusji jest dla programistów ukierunkowanie 16-bitowych systemów operacyjnych:
Normalnie Jeśli używasz CAsyncSocket, należy unikać blokowania operacji i działa asynchronicznie, zamiast.W operacji asynchronicznych od punktu, w którym zostanie wyświetlony WSAEWOULDBLOCK kod błędu po wywołaniu odbioru, na przykład czekać aż do użytkownika OnReceive powiadomić, że można odczytać ponownie wywoływana jest funkcja Członkowskich.Asynchronicznych wywołań przez oddzwanianie socket's odpowiednie wywołania zwrotnego powiadomienia funkcji, takich jak OnReceive.
W systemie Windows blokowania połączeń są uważane za złe rozwiązanie.Domyślnie CAsyncSocket obsługuje wywołania asynchroniczne, a trzeba zarządzać samodzielnie za pomocą wywołania zwrotnego powiadomienia zablokowania.Klasa CSocket, z drugiej strony, jest synchroniczna.On pompy komunikatów systemu Windows i zarządza blokowania dla Ciebie.
Aby uzyskać więcej informacji o blokowaniu zobacz specyfikację Windows Sockets.Aby uzyskać więcej informacji na temat "funkcji na" zobacz Windows Sockets: gniazda powiadomień i Windows Sockets: wynikających z klasy Socket.
Aby uzyskać więcej informacji zobacz: