Изящно закрыл сокет TCP - PullRequest
       27

Изящно закрыл сокет TCP

7 голосов
/ 18 апреля 2011

Я пишу IRC-клиент на C ++, и в настоящее время у меня возникает проблема, когда при выходе я делаю:

Send("QUIT :Quit\r\n"); // just an inline, variadic send() wrapper
shutdown(m_hSocket, SD_BOTH);
closesocket(m_hSocket);

WSAShutdown();

Однако проблема в том, что сообщение QUIT не отправляется. Я прослушал пакеты, поступающие от клиента, и на самом деле это сообщение никогда не отправляется. Я полагаю, что это проблема с не очищенным сокетом, но я понятия не имею, как это сделать, и Google предложил отключить алгоритм Nagle, но я сомневаюсь, что это хорошая практика.

Заранее спасибо.

1 Ответ

6 голосов
/ 18 апреля 2011

Прежде всего вы должны проверить возвращаемое значение send: действительно ли данные, которые вы пытаетесь отправить, принимаются сетевым стеком?(Как правило, это следует делать после каждого send вызова, а не только в этом случае.)

Если данные приняты, то AFAIK должен фактически передаваться в результате вызова shutdown,Вы можете попробовать использовать SO_LINGER, чтобы увидеть, если это что-то меняет, см. Изящное завершение работы, параметры задержки и закрытие сокета на MSDN .

...