服务器端口没有接收到UDP消息

UDP message not being received on server port

本文关键字:UDP 消息 服务器端      更新时间:2023-10-16

我正在尝试实现一个服务器-客户端关系,所有在我的本地机器上。

我有一个java程序作为服务器,它监听端口4567。我有一个java程序作为客户端,它打开到127.0.0.1:4567的连接并发送消息。

一切正常,消息正在被接收。

我在c++中使用boost asio实现了客户端程序,以相同的方式发送消息,但它不起作用,尽管消息已成功发送。

不工作的c++客户端代码:
    using namespace boost::asio;
    io_service io_service;
    ip::udp::socket socket(io_service);
    ip::udp::endpoint remote_endpoint;
    socket.open(ip::udp::v4());
    remote_endpoint = ip::udp::endpoint(ip::address::from_string("127.0.0.1"), 4567);
    boost::system::error_code err;
    string msg = err.message();
    socket.send_to(buffer("test_from_c++", 13), remote_endpoint, 0, err);
    msg = err.message();
    cout << err.message() << endl;
    socket.close();

输出

The operation completed successfully

另外,这里是工作的java客户端代码

String address = "127.0.0.1";
int port = 4567;
Socket socket = new Socket(address, port);
System.out.println("Successfully opened socket for communication to " + address + " on port " + port);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
out.write("test_from_java");
out.newLine();
out.close();
socket.close();

c++代码正确发送了UDP消息。请看这里的演示。

这个问题很可能是服务器正在等待一个TCP连接,并且不会接收使用不同传输协议的数据。Java客户端使用提供TCP通信的java.net.Socket类。另一方面,java.net.DatagramSocket类用于UDP通信。

下面是一个等效的TCP客户端:
#include <iostream>
#include <boost/asio.hpp>
int main()
{
  using namespace std;
  using namespace boost::asio;
  io_service io_service;
  ip::tcp::socket socket(io_service);
  ip::tcp::endpoint remote_endpoint;
  remote_endpoint = ip::tcp::endpoint(ip::address::from_string("127.0.0.1"), 4567);
  socket.connect(remote_endpoint);
  boost::system::error_code err;
  string msg = err.message();
  socket.send(buffer("test_from_c++", 13), 0, err);
  msg = err.message();
  cout << err.message() << endl;
  socket.close();
}