代码之家  ›  专栏  ›  技术社区  ›  Michael Kohne

如何确定由于中间网络断开而导致TCP套接字死机所需的最长时间?

  •  2
  • Michael Kohne  · 技术社区  · 15 年前

    我有一个C++程序,使用在Ubuntu 7.04上运行的标准套接字API,它向服务器打开一个套接字。我的系统在路由器后面。我想知道,一旦我的程序在路由器与网络断开后开始发送,发生套接字错误需要多长时间。

    也就是说,我的程序可能会闲置(等待用户)。路由器与Internet断开连接,然后我的程序尝试通过该套接字进行通信。

    显然,它不会很快知道,因为TCP非常擅长在不利的网络条件下保持套接字活动。这会导致TCP在最终放弃之前多次、多次地重试。

    我需要建立某种“最坏情况”的时间,我可以给质量保证小组(和客户),以便他们可以测试我的代码进入适当的离线状态。

    (供参考,我的程序是加油站加油泵系统的一部分,服务器是授权付款交易的系统。由于各种原因,站点完全有可能与网络断开,而客户只想知道会发生什么)。

    编辑:我不清楚。没有人在等待这件事,这只是一个系统离线的后台符号。当auth在30秒内不返回时,事务就结束了,人们将要去做其他事情。

    编辑:我得出的结论是,这个问题在一般情况下并不能真正回答。确定TCP连接因下游故障而出错所需的时间的因素数量太依赖于确切的设备和故障,因此无法给出简单的答案。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Christopher    15 年前

    您应该能够使用:

    http://linux.die.net/man/2/getsockopt

    用:

    所以,你的时间和你的时间

    确定所涉及的超时。

    这个链接: http://linux.die.net/man/7/socket

    谈论更多你感兴趣的选择。

    根据我的经验,选择时间通常是个坏主意。即使在听起来合理的情况下,任意的超时通常在实践中表现得不好。一般的结果是,当环境超出标准时,应用程序将变得不可用。

    特别是对于金融交易,应该避免这种情况。也许提供一个取消按钮和一些显示事务花费比预期长的指示是一个更好的解决方案。

        2
  •  1
  •   Simeon Pilgrim    15 年前

    我想换个角度来回答这个问题:一个接线员准备站在那里等多久,在他们说之前看起来很蠢,其中肯定不起作用,让我们用手工的方式。

    所以选择一些时间,比如1分钟(假设您的网络不是自动断开的,因此当流量发生时会重新连接)

    然后用这段时间计算你的程序在放弃之前等待的时间。关闭插座等显示错误信息。也许在等待的时候甚至有一个倒计时,所以直到操作员知道系统要等待多长时间…

    然后他们知道事务失败了,现在是手动时间。

    否则,根据您的IP堆栈,更糟的情况是超时可能是“永不超时”。

        3
  •  1
  •   Roddy    15 年前

    我认为最好的方法不是尝试确定正在使用的超时,而是亲自指定超时。

    根据您的操作系统,您可以:

    • 将setsockopt()与选项一起使用,以便
    • 使用非阻塞send(),然后使用带有超时的select()。
    • 使用非阻塞send(),并在接收预期数据时超时。