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

5
Konstantinos Kyriakos 30 Май 2019 в 16:09

2 ответа

Лучший ответ

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

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

5
Jesper Juhl 30 Май 2019 в 13:16

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

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

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

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

-3
Leo Le Bouter 30 Май 2019 в 13:30