Сокеты Windows. БлокировкаWindows Sockets: Blocking

В этой статье и двух сопутствующих статьях объясняются некоторые проблемы, связанные с программированием Windows Sockets.This article and two companion articles explain several issues in Windows Sockets programming. В этой статье рассматривается блокировка.This article covers blocking. Другие проблемы описаны в статьях: сокеты Windows: порядок байтов и сокеты Windows: преобразование строк.The other issues are covered in the articles: Windows Sockets: Byte Ordering and Windows Sockets: Converting Strings.

Если вы используете или наследуете от класса CAsyncSocket, вам придется самостоятельно управлять этими проблемами.If you use or derive from class CAsyncSocket, you will need to manage these issues yourself. Если вы используете или наследуете от класса CSocket, MFC управляет ими.If you use or derive from class CSocket, MFC manages them for you.

БлокировкаBlocking

Сокет может находиться в режиме блокирования или в неблокирующем режиме.A socket can be in "blocking mode" or "nonblocking mode." Функции сокетов в блокирующем (или синхронном) режиме не возвращают, пока они не смогут завершить действие.The functions of sockets in blocking (or synchronous) mode do not return until they can complete their action. Это называется блокировкой, так как сокет, функция которого была вызвана, не может ничего делать — блокируется, пока вызов не вернет.This is called blocking because the socket whose function was called cannot do anything — is blocked — until the call returns. Например, вызов Receive функции-члена может занять произвольное время, так как ожидает отправки отправляющего приложения (это происходит, если используется CSocket или используется CAsyncSocket with Block).A call to the Receive member function, for example, might take an arbitrarily long time to complete as it waits for the sending application to send (this is if you are using CSocket, or using CAsyncSocket with blocking). Если CAsyncSocket объект находится в неблокирующем режиме (работает асинхронно), вызов возвращается немедленно, а текущий код ошибки, который может быть получен с помощью функции-члена GetLastError , является всаеваулдблокк, указывающим, что вызов был заблокирован, так как он не был возвращен немедленно из-за режима.If a CAsyncSocket object is in nonblocking mode (operating asynchronously), the call returns immediately and the current error code, retrievable with the GetLastError member function, is WSAEWOULDBLOCK, indicating that the call would have blocked had it not returned immediately because of the mode. ( CSocket никогда не возвращает всаеваулдблокк.(CSocket never returns WSAEWOULDBLOCK. Класс управляет блокировкой.)The class manages blocking for you.)

Поведение сокетов отличается от 32-разрядных и 64-разрядных операционных систем (например, Windows 95 или Windows 98), чем в 16-разрядных операционных системах (например, Windows 3,1).The behavior of sockets is different under 32-bit and 64-bit operating systems (such as Windows 95 or Windows 98) than under 16-bit operating systems (such as Windows 3.1). В отличие от 16-разрядных операционных систем, 32-разрядные и 64-разрядные операционные системы используют вытесненное многозадачность и обеспечивают многопоточность.Unlike 16-bit operating systems, the 32-bit and 64-bit operating systems use preemptive multitasking and provide multithreading. В 32-разрядных и 64-разрядных операционных системах можно разместить сокеты в отдельных рабочих потоках.Under the 32-bit and 64-bit operating systems, you can put your sockets in separate worker threads. Сокет в потоке может блокироваться, не мешая другим действиям в приложении и не тратя время на блокировку.A socket in a thread can block without interfering with other activities in your application and without spending compute time on the blocking. Сведения о многопоточном программировании см. в статье многопоточность.For information on multithreaded programming, see the article Multithreading.

Примечание

В многопоточных приложениях можно использовать блокирующую природу, CSocket чтобы упростить структуру программы, не влияя на скорость реагирования пользовательского интерфейса.In multithreaded applications, you can use the blocking nature of CSocket to simplify your program's design without affecting the responsiveness of the user interface. При обработке взаимодействия пользователя в основном потоке и CSocket обработке в других потоках эти логические операции можно разделить.By handling user interactions in the main thread and CSocket processing in alternate threads, you can separate these logical operations. В приложении, которое не является многопоточным, эти два действия должны быть объединены и обработаны как единый поток, что обычно означает использование, CAsyncSocket поэтому вы можете обрабатывать запросы на обмен сообщениями по требованию или переопределять CSocket::OnMessagePending их для обработки действий пользователя во время длительной синхронной активности.In an application that is not multithreaded, these two activities must be combined and handled as a single thread, which usually means using CAsyncSocket so you can handle communications requests on demand, or overriding CSocket::OnMessagePending to handle user actions during lengthy synchronous activity.

Оставшаяся часть этого обсуждения предназначена для программистов, предназначенных для 16-разрядных операционных систем:The rest of this discussion is for programmers targeting 16-bit operating systems:

Обычно, если используется CAsyncSocket , не следует использовать блокирующие операции и выполнять асинхронную работу.Normally, if you are using CAsyncSocket, you should avoid using blocking operations and operate asynchronously instead. В асинхронных операциях с момента, когда вы получаете код ошибки всаеваулдблокк после вызова Receive , например, вы ждете, пока не будет OnReceive вызвана функция-член, чтобы уведомить о возможности повторного чтения.In asynchronous operations, from the point at which you receive a WSAEWOULDBLOCK error code after calling Receive, for example, you wait until your OnReceive member function is called to notify you that you can read again. Асинхронные вызовы выполняются путем вызова обратной функции уведомления о обратном вызове сокета, например OnReceive.Asynchronous calls are made by calling back your socket's appropriate callback notification function, such as OnReceive.

В Windows блокирующие вызовы считаются неправильными.Under Windows, blocking calls are considered bad practice. По умолчанию CAsyncSocket поддерживает асинхронные вызовы, и вам необходимо самостоятельно управлять блокировкой с помощью уведомлений обратного вызова.By default, CAsyncSocket supports asynchronous calls, and you must manage the blocking yourself using callback notifications. Класс CSocket, с другой стороны, является синхронным.Class CSocket, on the other hand, is synchronous. Она переносит сообщения Windows и управляет блокировками.It pumps Windows messages and manages blocking for you.

Дополнительные сведения о блокировке см. в описании спецификации сокетов Windows.For more information about blocking, see the Windows Sockets specification. Дополнительные сведения о функциях "on" см. в разделе сокеты Windows: уведомления сокетов и сокеты Windows: производные от классов сокетов.For more information about "On" functions, see Windows Sockets: Socket Notifications and Windows Sockets: Deriving from Socket Classes.

Дополнительные сведения см. в разделе:For more information, see:

См. также разделSee also

Сокеты Windows в MFCWindows Sockets in MFC
CAsyncSocket:: OnSendCAsyncSocket::OnSend