Вопрос к специалистам по сетевому программированию Windows.
Когда я использую псевдокод, подобный этому:
reconnect:
s = socket(...);
// more code...
read_reply:
recv(...);
// merge received data
if(high_level_protocol_error) {
// whoops, there was a deviation from protocol, like overflow
// need to reset connection and discard data right now!
closesocket(s);
goto reconnect;
}
Отключает ли ядро ядро и освобождает ли все данные, "физически" полученные от NIC(поскольку он уже должен быть там, в памяти ядра, ожидая, пока пользовательский уровень прочитает его с помощью recv ()), когда я закрою сокет ()?Ну, это логично, так как данные больше не связаны ни с каким внутренним объектом, верно?
Потому что я действительно не хочу тратить неизвестное количество времени на чистое отключение, такое как " call recv () довозвращает ошибку".Это не имеет смысла: что, если он никогда не вернет ошибку, скажем, сервер продолжает отправлять данные вечно и не закрывает соединение, но это плохое поведение?
Мне интересно об этом, так как я нехочу, чтобы мое приложение вызывало утечки памяти в любом месте.Является ли этот способ принудительного сброса соединения, который по-прежнему ожидается, для отправки неизвестного объема данных правильным?
// необязательное дополнение к вопросу: если этот метод считается правильным для окон,Можно ли считать его правильным (с изменением closesocket()
на close()
) для UNIX-совместимой ОС?