我需要一些帮助来理解我在使用asio时遇到的一个特殊问题。
我有一个客户端 - 服务器应用程序,带有一个c ++客户端(使用boost asio)向服务器发送2字节的听力(比如每秒)(用java编写)(并接收大量数据)。
很长一段时间,服务器正确接收2字节的HeartBeat,但之后服务器的'read'抱怨读取0字节,并关闭连接(我猜这对于阻塞读取是正确的)。然而,客户总是打印出它已经转移了正确的金额。我已经尝试了几乎所有'write'系列函数的变体。所有这些都是以'write_some'的形式实现的,这是否意味着这种行为是预期的?
我必须在使用中犯一些错误,基本上我在asio中寻找保证写入(至少一个字节)的内容。请帮我弄清楚我哪里出错了(如果需要进一步的信息的话)... 任何建议,非常感谢! 谢谢!
答案 0 :(得分:1)
如果是套接字,则不能“保证写入”;如果网络瘫痪,电缆拉出,交换机着火,或者电源在全球范围内,并且您的计算机恰好是唯一使用电池运行的电脑,该怎么办?
也就是说,听起来好像你有某种缓冲/清空问题,检查你的读取代码以确保它真正消耗了所有出现的数据。
0字节读取不是错误,再次查看该代码,检查套接字上的任何错误状态标志等。读取可能会失败并出现“AGAIN” - 状态,这实际上意味着您应该再试一次。
答案 1 :(得分:1)
strace
两端的应用程序。它将显示 read (), write ()等返回的任何错误代码。如果应用程序是多线程的,请使用strace -f
。
这种方法的优点是所有应用程序 - java,c ++,python在 strace 中显示相同,因此很容易发现不良行为。
在这种情况下,它可能会显示tcp连接已结束(正常)。