正常关闭TCP套接字

时间:2011-04-17 21:32:55

标签: c++ sockets tcp winsock irc

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

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

WSAShutdown();

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

提前致谢。

1 个答案:

答案 0 :(得分:6)

首先,您应该检查send的返回值:您尝试发送的数据是否实际被网络堆栈接受? (一般来说,这应该在每次send调用之后完成,而不仅仅是在这种情况下。)

假设数据被接受,那么AFAIK应该通过调用shutdown实际传输。您可以尝试使用SO_LINGER查看是否有所作为,请参阅Graceful Shutdown, Linger Options, and Socket Closure on MSDN