[Volgograd] recv, send и сокеты

Serge S. Fukanchik fuxx на mail.ru
Вт Янв 21 13:00:44 MSK 2003


vetalman wrote:
> Я правильно понимаю, что вызовы recv и send в unix и Windows
> синхронные, т.е. прога останавливается на их выполнении?
Конечно, так же как и работа с обычными файлами и каналами.
Сокет это самый обычный файловый дескриптор (т.е. тебе не обязательно
использовать recv/send можно read/write).
Я знаю 3 способа избежать блокирования потока, вызвавшего read/write в UNIX:
1. Перевести дескриптор в неблокирующий режим (fcntl O_NONBLOCK), тогда если 
сейчас ни нем нет данных read вернет -1 и установит errno в [EAGAIN],
O_NONBLOCK не имеет никакого эффекта, если на дескрипторе есть данные.
2. Использовать системные вызовы select/poll чтобы узнать будет ли заблокирован
вызов read/write для данного файлового дескриптора.
3. Использовать сигнал SIGIO который генерируется когда на дескрипторе
появляются данные.

> И что означает возврат нуля? Ошибка, закрытый сокет, принято пустое
> сообщение или сообщений нет?
0 означает что соединение закрыто (end of file), если сообщений нет
то вызов блокируется до появления данных. Пустых сообщений не бывает.

--
fuxx




Подробная информация о списке рассылки Volgograd