C - Обнаружение разрыва TCP-сокета - PullRequest
0 голосов
/ 24 марта 2020

Я реализую сокет сервера tcp. Сервер связывается с клиентским сокетом в другом устройстве.
Проблема в том, что если соединение внезапно оборвалось (кабель был удален), функция recv () не вернулась.
Я не могу реализовать механизм пинг-понга, потому что я не контролирую реализацию устройства.
После поиска по inte rnet некоторое время я нашел этот урок: http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
Но я не совсем понимаю тьютора. Если я вызываю setsockopt () для SO_KEEPALIVE, TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL, преподаватель говорит, что он переопределит общесистемные переменные (tcp_keepalive_time, tcp_keepalive_intvl, tcp_keepalive_probes)
влияет ли это на другие процессы?

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Функциональность TCP-keep-alive позволяет обнаруживать разорванные соединения. Вам необходимо явно включить его для сокета и изменить значения по умолчанию, чтобы он обнаруживал разорванное соединение раньше, как указывал ваш преподаватель.

Но я не полностью понимаю этого преподавателя. Если я вызову setsockopt() для SO_KEEPALIVE, TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL, преподаватель скажет, что он переопределит общесистемные переменные (tcp_keepalive_time, tcp_keepalive_intvl, tcp_keepalive_probes) Влияет ли это на другие сокеты, созданные другим потоком / process?

Это не так, setsockopt влияет только на сокет, который вы передаете в качестве аргумента.

0 голосов
/ 24 марта 2020

TCP не предоставляет хорошего способа обнаружения разорванного соединения на стороне, которая не отправляет. Если используемый устройством протокол не предоставляет серверу никакого способа для обнаружения разорванного соединения, протокол разорван. Все, что вы можете сделать, это реализовать тайм-аут приема, но это отстой.

Есть ли у протокола документация? Что это говорит делать?

...