c++ - 优雅地关闭 TCP 套接字

标签 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 的算法,但我怀疑这是一个好习惯。

提前致谢。

最佳答案

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

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

关于c++ - 优雅地关闭 TCP 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5696594/

相关文章:

c++ - 如何将相同的 int 值设置为 int 数组

C - 填充 TCP 套接字发送缓冲区

c++ - 第一个包无法使用非阻塞 tcp 套接字发送

c++ - 在 char 数字中流式传输

使用嵌套函数调用的 C++ 命名返回值优化

python - 在同一个套接字上监听时多个进程之间的巨大 CPU 时间差异

c - 将数据从 iphdr 传递到结构

tcp - 我应该使用的端口范围是多少?

android - 如何在 Android 中实现 C++ vector ?

java - 使用java套接字获取网页