【问题标题】:boost asio: 0 byte writeboost asio:0字节写入
【发布时间】:2009-07-06 08:37:47
【问题描述】:

我需要一些帮助来理解我在使用 asio 时遇到的一个特殊问题。

我有一个客户端-服务器应用程序,带有一个 c++ 客户端(使用 boost asio)向服务器(用 java 编写)发送 2 字节的心跳(例如,每秒)(并接收大量数据)。

在相当长的几分钟内,服务器正确接收到 2 字节的 HeartBeat,但之后服务器的“读取”会抱怨读取 0 字节,并关闭连接(我猜这对于阻塞读取是正确的)。然而,客户总是打印出它正在转移正确的金额。

我已经尝试过几乎所有“写入”函数系列的变体。它们都是根据“write_some”实现的吗?这是否意味着这种行为是预期的?

我在使用中一定犯了一些错误,基本上我在 asio 中寻找可以保证写入(至少一个字节)的东西。请帮我弄清楚我哪里出错了(如果需要任何进一步的信息。)... 任何建议,非常感谢! 谢谢!

【问题讨论】:

    标签: c++ boost-asio


    【解决方案1】:

    如果是套接字,则不能“保证写入”;如果网络中断、电缆被拉断、开关着火或全球范围内断电,而您的计算机恰好是唯一使用电池运行的计算机,该怎么办?

    也就是说,听起来好像您可能遇到某种缓冲/清空问题,请检查您的读取代码以确保它确实消耗了出现的所有数据。

    0 字节读取不是错误,请再次查看该代码,检查套接字上的任何错误状态标志等等。读取可能会以“AGAIN”状态失败,这实际上意味着您应该再试一次。

    【讨论】:

    • 嗨放松,感谢您的回复。 'read' 在 java 服务器中,按照代码,它似乎就像经典的 'select' 后跟一个('blocking')'read',(我认为 EAGAIN 只有在设置了非阻塞的情况下) .所有它的其他java客户端都没有问题。我对“正常”阻塞读取调用上的 0 字节读取有点困惑(所有 n/w 书籍和文档都提到 read
    • 读取返回 0 几乎是说“另一端关闭了 tcp 连接”的标准方式。用例如验证它像wireshark这样的网络监视器。
    【解决方案2】:

    strace 两端的应用程序。它将显示由 read()、write() 等返回的任何错误代码。如果应用程序是多线程的,请使用 strace -f

    这种方法的优点是所有应用程序 - java、c++、python 在 strace 中显示相同,因此很容易发现不良行为。

    在这种情况下,它可能会显示 tcp 连接(优雅地)结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      相关资源
      最近更新 更多