【发布时间】:2014-05-10 12:39:26
【问题描述】:
我正在尝试在 C++ 应用程序和 Java 应用程序之间来回发送数据。 C++程序是客户端,java程序是服务器。将请求从客户端发送到服务器有效,但反之则不行。
当我在boost::asio::write 之后使用boost::asio::read 等待服务器的响应时,服务器没有收到之前通过写入发送的数据,并且客户端在读取时阻塞)。如果我取消注释boost::asio::read 命令发送工作。
以下是 C++ 客户端类的重要部分:
连接建立:
_socket = new tcp::socket(_io_service);
tcp::no_delay option(true);
tcp::resolver resolver(_io_service);
boost::asio::connect(*_socket, resolver.resolve({_host, _port}));
_socket->set_option(option);
先写再读到socket:
// Send length of the query
uint32_t length = message.size();
boost::asio::write(*_socket, boost::asio::buffer(&length, 4));
// Now send the message
const char *messageBuffer = message.c_str();
size_t messageBufferLength = std::strlen(messageBuffer);
boost::asio::write(*_socket, boost::asio::buffer(messageBuffer, messageBufferLength));
// Receive length of answer
uint32_t lengthAnswer = 0;
boost::asio::read(*_socket, boost::asio::buffer(&lengthAnswer, 4));
在 Java 服务器端:
连接是通过 Socket 建立的(来自 ServerSocket.accept() )。然后打开一个 DataInputStream 和一个 DataOutputStream:
this.dis = new DataInputStream(socket.getInputStream());
this.dos = new DataOutputStream(socket.getOutputStream());
所有的阅读都是基于这种方法,其余的只是转换等:
private byte[] readBytes(int n) throws IOException {
byte[] data = new byte[n];
dis.readFully(data);
return data;
}
我做错了吗?真的很奇怪,没有 boost::read() 就可以工作。
【问题讨论】:
-
调试此类问题的最简单方法是结合使用系统调用跟踪器(strace、ktrace、dtrace)和网络嗅探器(tcpdump、wireshark 等)。第一个将显示在框架的抽象场景背后实际发生的操作系统对话,第二个将显示在网络层实际发生的情况。您可以比较两种方案,并查看系统调用之间以及网络中数据包之间的差异。
-
这似乎是嵌入此代码的软件的一个奇怪的副作用。独立客户端按预期工作。我还没找到原因。有些东西阻止了套接字从缓冲区发送数据。
-
@Guillermo 在这种情况下,我建议要么编辑问题,要么自己回答这个问题,然后问一个新的问题,提到代码嵌入的软件。就像使用慢速 boost-asio 标签的人一样会看到一个未回答的问题,并且可能会仔细阅读您的所有代码以查看有什么问题在他们注意到您的评论之前,说明代码本身确实有效。至少这可能会发生^^
标签: java c++ sockets boost boost-asio