Когда вы убиваете свое клиентское приложение, операционная система закрывает все свои открытые дескрипторы ввода-вывода. Когда TCP-соединение закрывается таким образом, оно отправляет FIN своему партнеру. В этом отношении, убить вашего клиента неотличимо от того, чтобы он грациозно вышел из него.
После установления TCP-соединения понятия «клиент» и «сервер» отсутствуют; это простой, двунаправленный канал связи. Результат, с точки зрения сети / сокетов, один и тот же, независимо от того, какая сторона прервана.
Если вы видите различия в поведении, то это в программировании двух приложений. Блокирующий вызов recv()
должен возвращать количество байтов, которые были доступны при закрытии соединения, или, возможно, -1 при ошибке.
Я предлагаю использовать strace <client program and args>
в вашем процессе, чтобы точно узнать, что происходит с этим системным вызовом.