Как закрытие сокета влияет на чтение чужой стороны - PullRequest
5 голосов
/ 30 мая 2019

Например, у нас есть сервер-клиентское приложение.Если сервер напишет сообщение в сокет, а затем закроет его перед чтением клиента.Сможет ли клиент прочитать сообщение?

Ответы [ 2 ]

5 голосов
/ 30 мая 2019

"Если сервер напишет сообщение в сокет, а затем закроет его перед чтением клиента. Сможет ли клиент прочитать сообщение?"

Да.Клиент получит данные, которые были отправлены до пакета FIN, который закрывает сокет.

0 голосов
/ 30 мая 2019

Это поведение зависит от реализации, в общем, вы не должны предполагать, что клиент может прочитать сообщение, close(2) в руководстве Linux говорит:

Be sure to use shutdown(2) to shut down all parts the connection before closing the socket.

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

Когда вы отправляете данные через сокет, а затем закрываете тот же сокет, нет никакой гарантии, что ядро ​​освободило свои внутренние буферы от сети или даже могло бы сделать это (возможные проблемные условия сети).

...