Строго говоря, вам не нужны никакие из этих опций сокетов:
* SO_LINGER
Вам нужно установить SO_LINGER
только в том случае, если ваше приложение все еще имеет ожидающие отправки пакеты при вызове close(2)
или shutdown(2)
. Не совсем применимо для вашего приложения.
* SO_KEEPALIVE
Отправка сообщений проверки активности каждые два часа на самом деле поможет только очень долгим, но очень тихим соединениям, проходящим через брандмауэры с состоянием и очень длительным временем ожидания сеанса. (Два часа между пингами - это слишком много, чтобы быть практичным в современном Интернете.)
* SO_NODELAY
Это (предположительно псевдоним для TCP_NODELAY) отключает Алгоритм Нейгла , который является просто проблемой избежания небольших пакетов. Возможно, Nagle мешает вашему приложению, но для обработки задержек в 500 мс требуются специальные последовательности пакетов; он никогда не просто вешает соединения.
* SO_REUSEADDRESS
Полезно для всех «серверов», которые прослушивают общеизвестные номера портов; использование «клиентов» почти всегда закрывает какую-либо ошибку или иное, но иногда это необходимо, если запросы должны поступать с хорошо известного номера порта.
* SO_SENDBUFFER
* SO_RECBUFFER
Эти размеры буфера влияют на размеры буфера на стороне ядра, поддерживаемые для приема или отправки данных, пока ваша программа (буфер приема) или сокет (буфер отправки) еще не готовы принять больше данных. Если они установлены слишком маленькими, ваше приложение может не передавать данные настолько плавно, насколько это возможно, что снижает пропускную способность, но это не должно приводить к остановкам, если они установлены меньше оптимального. Конечно, слишком большое значение может привести к необоснованным требованиям к памяти ядра, но должен быть разумный общесистемный максимально допустимый размер.
* TCP_NODELAY
Отключает Нэгла. Маловероятно, чтобы сделать больше, чем ввести задержки 500 мс, если ваше приложение отправляет несколько небольших пакетов перед попыткой чтения блокировки.
Действительно, вам не нужно устанавливать какие-либо параметры сокетов.
Можете ли вы перевести свой код во что-то, что можно вставить сюда, проверить или проверить? Я привыкла к тому, что сеансы TCP выживают без проблем несколько дней или недель, так что это довольно удивительно.