LINUX.ORG.RU

Проблема accept() + Send()


0

0

Имеется следующая ситуация :

в программном куске типа //------------- ... int sock = accept(srv_sock, ...); ... Send(...); ... //------------- программа на функции Send() переходит Send-blocking mode (как я эту ситуацию понял) пока существует соединение по сокету sock. Сокет srv_sock установлен в блокирующий режим.

Почему программа не может выполнить Send() пока не отрублен клиент sock?

Если в очереди нет сообщений, а сокет не маркирован как неблокирующий, то accept блокирует вызвавшую программу до появления соединения. Если сокет маркирован как неблокирующий, а в очереди нет сообщений, то accept возвращает EAGAIN. Для того, чтобы получать уведомления о входящих сообщениях на сокете, нужно использовать select(2) или poll(2). В этом случае, когда придёт запрос на новое соединение, будет доставлено событие "можно читать", и после этого вы можете вызвать accept, чтобы получить сокет для этого соединения. Вы можете также настроить сокет так, чтобы он посылал сигнал SIGIO, когда на нём происходит какая-либо активность; см. socket(7), где описаны детали. Когда сообщение не помещается в буфер отправки сокета, send обычно дожидается завершения отправки, если только сокет не находится в неблокирующем режиме. Если так, то возвращается EAGAIN. Системный вызов select(2) можно использовать для выяснения возможности отправки данных. (man accept, man send)

Banshee
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.