Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
boost::asio::read阻止boost:asio::write向Java套接字发送数据_Java_C++_Sockets_Boost_Boost Asio - Fatal编程技术网

boost::asio::read阻止boost:asio::write向Java套接字发送数据

boost::asio::read阻止boost:asio::write向Java套接字发送数据,java,c++,sockets,boost,boost-asio,Java,C++,Sockets,Boost,Boost Asio,我试图来回地在C++应用程序和java应用程序之间发送数据。C++程序是客户端,java程序是服务器。将请求从客户机发送到服务器是可行的,但不是相反 当我在boost::asio::write之后使用boost::asio::read来等待服务器的响应时,之前通过write发送的数据不会被服务器接收,而客户端在读取时会阻塞)。如果我取消注释boost::asio::read命令发送工作 强>这里是C++客户端类的重要部分:>/P> 建立连接: 首先写入套接字,然后读取套接字: 在Java服务

我试图来回地在C++应用程序和java应用程序之间发送数据。C++程序是客户端,java程序是服务器。将请求从客户机发送到服务器是可行的,但不是相反

当我在
boost::asio::write
之后使用
boost::asio::read
来等待服务器的响应时,之前通过write发送的数据不会被服务器接收,而客户端在读取时会阻塞)。如果我取消注释boost::asio::read命令发送工作

<>强>这里是C++客户端类的重要部分:>/P> 建立连接:

首先写入套接字,然后读取套接字:

在Java服务器端:

通过套接字(来自ServerSocket.accept())建立连接。然后打开DataInputStream和DataOutputStream:

所有读数均基于此方法,其余仅为转换等:


我做错什么了吗?它在没有boost::read()的情况下工作真的很奇怪。

代码本身似乎工作正常。我在周围的软件之外尝试过它-因此它在某种程度上一定是该软件中的一个问题。

调试此类问题的最简单方法是使用syscall tracer(strace、ktrace、dtrace)和网络嗅探器(tcpdump、wireshark等)的组合。第一个将显示在框架的抽象场景后面实际发生的操作系统对话,第二个将显示在网络层实际发生的事情。您可以比较两种情况,并查看系统调用和网络中数据包之间的差异。这似乎是嵌入此代码的软件的一个奇怪的副作用。独立客户端按预期工作。我还没找到原因。有些东西阻止套接字从缓冲区发送数据。@Guillermo在这种情况下,我建议编辑问题或自己回答这个问题,并询问一个新问题,提及代码嵌入的软件。正如人们在慢boost-asio标签上看到的一样,他们会看到一个未回答的问题,并且可能会仔细阅读您的所有代码,在他们注意到您的评论之前,看看哪里出了问题,并声明代码本身是有效的。至少这可能会发生^^
_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);
// 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));
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;
}