我正在用 C++ 编写一个 IRC 客户端,目前我遇到一个问题,在退出时,我会:
Send("QUIT :Quit\r\n"); // just an inline, variadic send() wrapper shutdown(m_hSocket, SD_BOTH); closesocket(m_hSocket); WSAShutdown();
但是,问题在于未发送 QUIT 消息。我嗅探了来自客户端的数据包,实际上从未发送过此消息。我认为这是套接字未刷新的问题,但我不知道该怎么做,谷歌建议禁用 Nagle 的算法,但我怀疑这是一个好习惯。
提前致谢。
最佳答案
首先您应该检查send
的返回值:您尝试发送的数据是否真的被网络堆栈接受了? (一般来说,这应该在每次 send
调用之后完成,而不仅仅是在这种情况下)。
假设数据被接受,那么 AFAIK 它应该作为调用 shutdown
的结果实际传输。您可以尝试使用 SO_LINGER
来查看它是否有所不同,请参阅 Graceful Shutdown, Linger Options, and Socket Closure on MSDN .
关于c++ - 优雅地关闭 TCP 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5696594/