В моем клиентском программном обеспечении на основе TCP возникла забавная / раздражающая ситуация, и она выглядит следующим образом:
- мой клиентский процесс работает на ноутбуке и подключен через TCPна мой серверный процесс (который выполняется на другом компьютере через локальную сеть)
- безответственный пользователь вытаскивает кабель Ethernet из своего ноутбука, пока клиент передает данные TCP
- клиентский процесс продолжает вызывать send ()с некоторыми дополнительными данными TCP, заполняя буфер SO_SNDBUF ОС, пока ...
- клиентский процесс не уведомляется (через функцию SCDynamicStoreCallback MacOS / X), что интерфейс Ethernet не работает, и отвечает, вызывая close ()на своем сокете TCP
- проходит от двух до пяти секунд ...
- пользователь подключает кабель Ethernet обратно к
- , клиентский процесс получает уведомление о резервном копировании интерфейса, иавтоматически подключается к серверу
Это все работает довольно хорошо ... за исключением того, что часто есть также нежелательный шаг 8, которыйэто:
.8.Сокет TCP, который был close () d на шаге 4, восстанавливает (!) И отправляет оставшуюся часть данных, которые были в буфере исходящих данных ядра для этого сокета.Это происходит потому, что ОС пытается доставить все исходящие данные TCP до освобождения сокета ... обычно это хорошо, но в этом случае я бы предпочел, чтобы этого не произошло.
Итак,Вопрос в том, есть ли способ сказать уровню TCP отбросить данные в его SO_SNDBUF?Если это так, я мог бы сделать этот вызов непосредственно перед close () - с помощью мертвого сокета на шаге 4, и мне не пришлось бы беспокоиться о том, что данные зомби из старого сокета поступят на сервер после того, как старый сокет был оставлен.