0

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

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

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

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

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

4

2 回答 2

1

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

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

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

于 2009-07-06T08:52:52.160 回答
1

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

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

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

于 2009-12-15T13:01:50.117 回答