Это поведение зависит от реализации, в общем, вы не должны предполагать, что клиент может прочитать сообщение, close(2)
в руководстве Linux говорит:
Be sure to use shutdown(2) to shut down all parts the connection before closing the socket.
Если вы хотите убедиться, что клиент прочитал это сообщение, сделайте так, чтобы этот клиент подтвердил это действие в протоколе вашего приложения.
Когда вы отправляете данные через сокет, а затем закрываете тот же сокет, нет никакой гарантии, что ядро освободило свои внутренние буферы от сети или даже могло бы сделать это (возможные проблемные условия сети).