Как можно иметь тайм-аут отправки на неблокирующем сокете?

У меня есть некоторые проблемы с пониманием работы сокетов в Linux.

setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(int));
write = write(sockfd, buf, len);

В приведенном выше коде, поскольку записи буферизуются, тайм-аут отправки не имеет никакого смысла (системный вызов write будет возвращен немедленно, когда буфер пространства пользователя будет скопирован в буферы ядра). Размер буфера отправки является гораздо более важным параметром, но время ожидания отправки, похоже, ничего не стоит. Но я определенно ошибаюсь, так как я видел довольно много кода, который использует SO_SNDTIMEO. Как может тайм-аут кода пользовательского пространства с использованием SO_SNDTIMEO при условии, что приемник работает очень медленно?

2 ответа

Решение

Как можно иметь тайм-аут отправки на неблокирующем сокете?

Это не так. Тайм-ауты для режима блокировки. Неблокирующая recv() не будет блокировать, и, следовательно, не может также истечь время.

Я видел много кода, который использует SO_SNDTIMEO.

Не в неблокирующем режиме, если только соответствующий код не является чепухой.

SO_SNDTIMEO полезен для блокирующего сокета. Если буфер сокета заполнен, send() может заблокировать, и в этом случае может быть полезно использовать опцию сокета SO_SNDTIMEO. Для неблокирующих сокетов, если буфер сокета заполнен, отправка немедленно завершится неудачей, поэтому нет смысла устанавливать SO_SNDTIMEO с неблокирующим сокетом.

Другие вопросы по тегам