Как узнать конец сеанса TCP? - PullRequest
0 голосов
/ 25 июня 2019

каждый, я хочу знать, когда мое TCP соединение будет завершено.Я имею в виду следующее: моя прога является клиентом и отправляет любые сообщения на сервер, но не знает, когда сервер закроет соединение (флаг отправки FIN).Это выглядит как рукопожатие, prog отправляет сначала msg, затем получает и отправляет следующее msg по тому же сокету, затем serv send FIN - флаг, который означает конец сеанса tcp или конец рукопожатия, как вам нравится.Моя цель - узнать, когда сервер говорит FIN, я использую потоковый сокет.

Я пытался использовать var flags из msdn doc int recv(SOCKET s ... int flags);.Но теперь я думаю, что это не то, что я ищу ...

int partresult = recv(*my_sock, RcvBytes, Size, 0);

1 Ответ

1 голос
/ 25 июня 2019

(я предполагаю, что вы имеете в виду TCP, поскольку FIN используется только в этом контексте).

Вызов recv() скажет вам, что вы ищете: он вернет 0 при получении FIN (т. Е. Вывод удаленного сокета был shutdown) (уже заявлено @RemyLebeau, и -1 в случае ошибки).

Я использую этот ответ как возможность предупредить вас о , а не , сравнивая его возвращаемое значение с ожидаемым числом прочитанных байтов, так как TCP не гарантирует, что один send() может быть прочитан с один read(). Так что не тест if (partresult < RcvBytes) ....

...