【问题标题】:Errors using same port on different machines在不同机器上使用相同端口的错误
【发布时间】:2016-02-23 05:36:07
【问题描述】:

我编写了一个应用程序(称为 M2),它读取到达一个端口的数据,对其进行处理,然后将结果发送到另一个端口。

如果我选择向 193.168.1.101:5001 发送数据,一切正常。

如果我发送到 192.168.1.101:5001,它不会。为什么更改 IP 地址的第一个字节会有影响?

更改的原因是当我将数据包传输到 193.168.1.101:5001 时大约需要一毫秒,但是当我传输到 192.168.1.101:5001 时需要一秒以上。这种千倍的时间变化弄乱了我程序中的其他一切——尤其是阅读器饥饿,我开始丢失输入数据包。

什么会导致传输时间发生如此剧烈的变化?请注意,传输不会失败,只是需要很长时间。

【问题讨论】:

  • 我同意人们对网络的看法。你说的不是网络问题,根本不可能。使用整个 IP 地址,而不是前 3 个八位字节。
  • 你能举个例子说明“我这样做时会出现各种可怕的错误”吗?
  • 你能ping通目标机器吗?
  • 我闻到了未定义的行为。发布一个独立的示例。
  • 小测试同步程序没有显示问题(一旦我修复了错字)。大型异步程序仍然显示问题,所以我将不得不尝试在那里跟踪它。这个周末我会很忙。

标签: c++ sockets boost boost-asio


【解决方案1】:

与 193.168.1.101:5001(大约 1 毫秒)相比,地址 192.168.1.101:5001 非常慢(大约 2 秒传输一个数据包)。由于发送器使用的是同步发送,因此输入的 CPU 不足,因此输入数据包被丢弃。

我将输出发送器更改为异步操作,并使用截止时间计时器来限制尝试发送数据包所花费的时间。这解决了输入饥饿问题。我使用了基于此的代码:http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/example/timeouts/blocking_udp_client.cpp

我仍然很好奇为什么一个地址会比另一个慢一千倍。错误地址与传输计算机位于同一子网(这是正确的术语吗?),所以也许与它有关?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2014-08-04
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    相关资源
    最近更新 更多