正常关闭TCP套接字

Sau*_*aul 7 c++ sockets irc tcp winsock

我正在用C++编写一个IRC客户端,目前我遇到了一个问题,退出后,我做了:

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

WSAShutdown();

但是,问题是没有发送QUIT消息.我嗅到了来自客户端的数据包,实际上这条消息从未发送过.我认为这是套接字没有被刷新的问题,但我不知道如何做到这一点,谷歌建议禁用Nagle算法,但我怀疑这是一个好习惯.

提前致谢.

Jon*_*Jon 6

首先,您应该检查以下内容的返回值send:您尝试发送的数据是否实际被网络堆栈接受?(一般来说,这应该在每次send通话后进行,而不仅仅是在这种情况下).

假设数据被接受,那么AFAIK应该通过调用实际传输shutdown.您可以尝试使用SO_LINGER它来查看它是否有所不同,请参阅MSDN上的Graceful Shutdown,Linger Options和Socket Closure.

  • 在调用`shutdown()`之后,你不应该在远程对等体确认断开请求之前调用`closesocket()`,通过在循环中调用`recv()`(可选地用`select()`来知道何时到调用`recv()`)直到它返回0(或错误). (9认同)