розетка в режиме блокировки - PullRequest
0 голосов
/ 21 января 2012

Как вы думаете, использование select () с блокирующим сокетом - это хорошая идея или лучше использовать таймаут SO_SNDTIMEO / SO_RCVTIMEO

(я под Linux, сокетis устанавливается в SOCK_STREAM)

Преимущество первого решения заключается в том, что оно может работать с сокетами любого типа (состояние блокировки и / или неблокирования)

1 Ответ

1 голос
/ 21 января 2012

Предполагая, что вы хотите продолжить select() с помощью read() / write() / send() / и т. Д., Когда оно вернет условия готовности, вы, безусловно, должны быть очень осторожны, если ваши файловые дескрипторы находятся в режиме блокировки.Для чтения необходимо убедиться, что вы читаете только один раз после того, как получите индикацию готовности к чтению, поскольку второе может блокироваться.Для записей это, вероятно, еще хуже: я предполагаю, что могут быть непонятные условия, при которых сокет сообщается о готовности к select(), но что-то происходит, и он больше не готов к тому времени, когда вы write() к нему.Даже если это последнее предположение слишком пессимистично, я бы посчитал это решение неприемлемым и плохой практикой.

Учитывая, что нетрудно динамически переключить файловый дескриптор с блокировки на неблокирование и обратно, используя fcntl(), выВас так беспокоит совместимость с блокирующими сокетами?Просто измените их на неблокирующие.

...