我正在用C ++编写一个IRC客户端,目前我遇到了一个问题,退出后我会这样做:
Send("QUIT :Quit\r\n"); // just an inline, variadic send() wrapper shutdown(m_hSocket, SD_BOTH); closesocket(m_hSocket); WSAShutdown();
但是,问题是没有发送QUIT消息。我嗅到了来自客户端的数据包,实际上这条消息从未发送过。我认为套接字没有刷新是一个问题,但我不知道如何做到这一点,谷歌建议禁用Nagle算法,但我怀疑这是一个好习惯。
提前致谢。
答案 0 :(得分:6)
首先,您应该检查send
的返回值:您尝试发送的数据是否实际被网络堆栈接受? (一般来说,这应该在每次send
调用之后完成,而不仅仅是在这种情况下。)
假设数据被接受,那么AFAIK应该通过调用shutdown
实际传输。您可以尝试使用SO_LINGER
查看是否有所作为,请参阅Graceful Shutdown, Linger Options, and Socket Closure on MSDN。