基于 C++ TCP 的服务器套接字需要时间才能返回 10054 错误。它不会立即返回

Posted

技术标签:

【中文标题】基于 C++ TCP 的服务器套接字需要时间才能返回 10054 错误。它不会立即返回【英文标题】:C++ TCP based Server socket takes time to return 10054 error. Its doesn't return immediately 【发布时间】:2016-10-24 09:13:27 【问题描述】:

我有用 C 编写的基于 linux 的 TCP 客户端和用 C++ 编写的服务器,并部署在 Windows 机器上。

    从服务器,我每 5 秒发送 1 个字节的数据。 客户收到它。 在客户端断开互联网连接后,当我查看服务器日志时,需要很长时间才能在服务器上返回错误 10054。 它是一个基于多套接字和多线程的 Windows 服务。

我应该怎么做才能立即出错??

【问题讨论】:

您无法立即得到错误。您和接收方之间有很多缓冲,这实际上保证了在对等方断开连接后,您不会在第一次发送时重置连接。 我们怎样才能减少这种延迟??可以通过增加或减少发送数据的时间间隔来实现吗? 解决这个问题的常用方法是使用 ping/pong - 客户端在接收到来自服务器的数据时发送回复。如果客户端在一定时间内没有回复,则假设它已断开连接并关闭连接。 @MrZebra。惊喜!!!!没有优雅的方法来处理这种情况。我还打算在服务器端抽出时间。 是的,这是 TCP 稳健性的一部分——如果你重新插入互联网连接,它会继续进行,就好像什么都没发生过一样 【参考方案1】:

您是否在切断互联网之前关闭客户端的连接?

如果客户端刚刚停止响应服务器(After disconnecting internet),则双方的 TCP-socket 将在timeout 过期后关闭连接。这是 TCP 的默认行为。 timeout可以修改,但最好正确关闭连接并保持timeout不修改

【讨论】:

如果他是在客户端断开互联网,他在客户端是否关闭连接没有任何区别,并且客户端无法在互联网后响应已断开连接。答案没有意义。 @Domso 。您是否还建议在服务器上超时?我无法理解你的回答 @EJP 在切断连接后有延迟是正常的。 (超时),但如果您在切断互联网之前关闭连接,它确实会有所不同。如果你真的想减少延迟,你可以调整TCP-timeout @Domso 当然会有所不同,但是如果你在切断互联网之前关闭连接真的没有什么可切断的,并且不会出现OP的问题。 @EJP 是的,这就是我问它的原因 - 澄清连接是否关闭。但我回答的第二部分回答了他的问题。

以上是关于基于 C++ TCP 的服务器套接字需要时间才能返回 10054 错误。它不会立即返回的主要内容,如果未能解决你的问题,请参考以下文章

Windows 环境下的 Socket 编程 4 - 基于 UDP 的服务器/客户端

TCP 环回连接与 Unix 域套接字性能

在 C++ 中通过 tcp 套接字发送结构

C++ UNIX 帮助 - 简单的 TCP 服务器套接字连接

c++ 服务器在客户端终止连接进程后不关闭 TCP 套接字连接

服务器端的 C++ TCP 套接字多次写入()被视为客户端的单次读取