Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье и двух дополнительных статьях объясняется несколько проблем программирования сокетов Windows. В этой статье рассматривается блокировка. Другие проблемы рассматриваются в статьях: сокеты Windows: упорядочение байтов и сокетов Windows: преобразование строк.
Если вы используете или извлекаете из класса CAsyncSocket, вам потребуется самостоятельно управлять этими проблемами. При использовании класса или наследовании от CSocket, MFC управляет ими для вас.
Блокировка
Сокет может находиться в режиме блокировки или в режиме неблокировки. Функции сокетов в режиме блокировки (или синхронного) не возвращаются, пока они не смогут завершить свое действие. Это называется блокировкой, так как сокет, функция которого была вызвана, не может ничего делать — блокируется, пока вызов не возвращается. Например, вызов Receive функции-члена может занять произвольное время, так как оно ожидает отправки приложения (это если вы используете CSocketили используете CAsyncSocket с блокировкой).
CAsyncSocket Если объект находится в режиме неблокировки (работает асинхронно), вызов возвращается немедленно, а текущий код ошибки, который можно извлечь с помощью функции-члена GetLastError, — WSAEWOULDBLOCK. Это указывает на то, что вызов был бы заблокирован, если бы не вернулся немедленно из-за текущего режима. (CSocket никогда не возвращает WSAEWOULDBLOCK. Класс обрабатывает блокировку для вас.)
Поведение сокетов отличается от 32-разрядных и 64-разрядных операционных систем (таких как Windows 95 или Windows 98), чем в 16-разрядных операционных системах (таких как Windows 3.1). В отличие от 16-разрядных операционных систем, 32-разрядные и 64-разрядные операционные системы используют предварительное многозадачность и обеспечивают многопоточность. В 32-битных и 64-битных операционных системах можно размещать сетевые сокеты в отдельных рабочих потоках. Сокет в потоке может блокироваться, не мешая выполнению других операций в вашем приложении и не расходуя вычислительные ресурсы на блокировку. Сведения о многопоточных программированиях см. в статье "Многопоточность".
Замечание
В многопоточных приложениях можно использовать блокирующий характер CSocket для упрощения проектирования программы, не влияя на скорость реагирования пользовательского интерфейса. Обрабатывая взаимодействия пользователей в основном потоке и выполняя обработку в альтернативных потоках, вы можете разделить эти логические операции. В приложении, которое не является многопоточным, эти два действия должны быть объединены и обрабатываться как один поток, что обычно означает использование, CAsyncSocket которое позволяет обрабатывать запросы на обмен данными по запросу или переопределять CSocket::OnMessagePending для обработки действий пользователей во время длительной синхронной активности.
Остальная часть этого обсуждения предназначена для программистов, работающих с 16-разрядными операционными системами.
Как правило, при использовании CAsyncSocketследует избегать использования блокирующих операций и асинхронно работать. В асинхронных операциях, после получения кода ошибки WSAEWOULDBLOCK после вызова Receive, например, вы ожидаете, пока функция-член OnReceive уведомит вас о том, что можно снова прочитать данные. Асинхронные вызовы осуществляются путем вызова соответствующей функции уведомления обратного вызова вашего сокета, например OnReceive.
В Windows блокировка вызовов считается плохой практикой. По умолчанию CAsyncSocket поддерживает асинхронные вызовы, и вам необходимо самостоятельно управлять блокировкой с помощью уведомлений обратного вызова. Наоборот, класс CSocket синхронен. Он обрабатывает сообщения Windows и управляет блокировкой для вас.
Дополнительные сведения о блокировке см. в спецификации сокетов Windows. Дополнительные сведения о функциях "On" см. в статье "Сокеты Windows: уведомления сокетов и сокеты Windows: производные от классов сокетов".
Дополнительные сведения можно найти здесь