Как можно иметь тайм-аут отправки на неблокирующем сокете?
У меня есть некоторые проблемы с пониманием работы сокетов в 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 с неблокирующим сокетом.