我有一些C ++代码写入正在由Java程序读取的套接字。
C ++程序使用boost :: async_write传输字节,然后由Java程序读取它们。 async_write调用的前4个字节对应于底层数据段的大小。由于此标头明确确定了大小,因此Java代码可以使用BufferedInputStream的“读取”方法填充一个字节数组,该字节数组是实际数据的大小。
虽然这似乎几乎每次都能正常工作,但有时InputStream读取的字节数组包含其缓冲区末尾的清零数据。以这种方式,每50000封邮件中约有1封被“破坏”。缓冲区中零点输出数据开始的位置会有所不同。虽然我可以抓住这个并抛出信息,但我想知道这是否是预期的表现?我试过这个,两个程序都通过localhost上的套接字进行通信,但仍有问题。
我不相信在C ++程序中写入的字节超出范围,因为它们暂时存储在队列中,直到“handle_write”返回(来自async_write)
C ++程序只有一个执行io_service的线程。
Java程序也在单个线程中执行读取。
我没有在任何一个程序中发现任何内存泄漏。
答案 0 :(得分:1)
最有可能的是,这个错误在阅读方面。你确定你真的读过整个消息吗?
答案 1 :(得分:0)
我使用IO和NIO编写了许多Socket程序,这些问题总是由bug引起的。我建议你尝试将Java连接到Java来测试bug是在Java还是C ++端。