服务器端口未收到 UDP 消息

Posted

技术标签:

【中文标题】服务器端口未收到 UDP 消息【英文标题】:UDP message not being received on server port 【发布时间】:2015-08-28 16:16:06 【问题描述】:

我正在尝试在我的本地计算机上实现服务器 - 客户端关系。

我有一个 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();

【问题讨论】:

你需要一个 io_service.run() 在哪里拨打电话? @ChrisWard1000 同步操作不需要io_service.run() 【参考方案1】:

C++ 代码正在正确发送 UDP 消息。请参阅here 进行演示。

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

这是一个等效的 TCP 客户端demonstrated:

#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();

【讨论】:

谢谢。我从一开始就打算只使用 UDP 协议。我将服务器实现切换到 DatagramSocket,它工作了。

以上是关于服务器端口未收到 UDP 消息的主要内容,如果未能解决你的问题,请参考以下文章

在特定端口监听 UDP 消息

仅在第一次运行时接收来自 Java 的 UDP 消息

TCP/UDP常见端口

TCP/UDP常见端口参考

如何在linux中使用iptables打开UDP端口

Android SipProfile Uri UDP 端口错误