Вы должны убедиться, что вы вызываете shutdown(s, SHUT_WR
), а затем close(s)
в процессе сервера после отправки всех данных.
Вызов shutdown()
сообщает уровню TCP, что больше нет данных для отправки.
ТБХ, я не совсем уверен, почему сам по себе вызов close()
также не достигает этого.
РЕДАКТИРОВАТЬ - Я понял это сейчас - это потому, что в этот момент в вашем коде у родителя все еще открыт сокет, поэтому ядро его не разрушает. Если после fork()
вы добавите дополнительную логику:
if (p > 0) {
close(connected);
}
тогда ваш код работает без вызова shutdown()
.
Если вы используете код, который я отправил в мой ответ на ваш вчерашний вопрос, тогда клиент получит bytes_received
отсчет нуля, а затем завершит свой цикл.