Как установить сокеты в режим блокировки в Windows? - PullRequest
3 голосов
/ 30 августа 2009

Я занимаюсь довольно простым кроссплатформенным программированием сокетов TCP. К сожалению, я обнаружил, что при компиляции в Windows мои сокеты не блокируются по умолчанию, а в OS X они блокируются по умолчанию. Как заставить сокет перейти в режим блокировки в Windows? Обычно они по умолчанию используют неблокирующий режим или что-то ужасно не так?

Мой код частично основан на следующих простых примерах: http://cs.baylor.edu/~donahoo/practical/CSockets/code/TCPEchoClient.c http://cs.baylor.edu/~donahoo/practical/CSockets/code/TCPEchoServer.c

Ответы [ 2 ]

4 голосов
/ 31 августа 2009

Нет, обычные старые сокеты в стиле BSD не не блокируются по умолчанию в Windows. См. Примеры в FAQ программиста Winsock .

Если вы используете MFC и его беспорядок CAsyncSocket, тогда да, все это неблокирующее, но это отдельная проблема .

3 голосов
/ 30 августа 2009

Я считаю, эта ссылка может помочь; обратите внимание, в частности, что

Хотя блокировка операций на сокеты поддерживаются под Windows Розетки, их использование сильно не рекомендуется. Программисты, которые вынужден использовать режим блокировки - например, как часть существующего приложение, которое должно быть портировано - следует знать о семантике блокировка операций в Windows Розетки.

Если вы полностью осведомлены о миллионе проблем, перечисленных здесь здесь , и считаете, что решение всех из них предпочтительнее, чем проектирование вашей программы в соответствии с Windows, а не наполовину звуковой сигнал ed порт из Unix, продолжайте с вызовом ioctlsocket с аргументом cmd, установленным в FIONBIO, и третьим аргументом, указывающим на длинное слово, равное 0. Но не говорите, что вас не предупреждали ; -.)

...