1

我正在编写一个服务器和客户端程序,以在使用 Boost 库的 Windows PC 和使用 asio 独立库的 Linux ARM beagleboard 之间进行通信。我有一段时间在两个设备之间进行了成功的 UDP 通信,但现在我想从客户端连接时服务器发现的端点恢复端口。客户端连接的方式是通过查询:

udp::resolver resolver(io_service);
udp::resolver::query query_tx(udp::v4(), hostIP, "43210");
udp::endpoint receiver_endpoint_tx = *resolver.resolve(query_tx);

其中主机 IP 是一个字符串,这可以正常工作。在调试时,我注意到当我检查返回的值时:

receiver_endpoint_tx.port()

这将返回 51880。现在不要大喊大叫网络字节顺序和主机字节顺序。我知道。奇怪的是,这个数字 51880 有时是一个不同的数字,当我检查服务器在其端点中存储的内容时,它是一个完全不同的数字:21743。现在我知道我必须在字节顺序上做错了,但我试过了:

//unsigned long port_long       = boost::asio::detail::socket_ops::host_to_network_long(receiver_endpoint_tx.port());
//unsigned long port_short      = boost::asio::detail::socket_ops::host_to_network_short(receiver_endpoint_tx.port());

他们没有把我原来的端口:43210 还给我。网络主机也没有。那么我错过了什么,我如何才能在两端恢复我的 43210 端口?显然它一定在某个地方,因为他们正在成功地沟通。在此先感谢,如果菜鸟错误,对不起:)

4

1 回答 1

3

首先,UDP是无连接的,没有连接

我不确定我是否理解正确,但听起来我也想绑定到特定的端口号。如果您希望客户端从端口 x 发送数据包到服务器上的端口 y,并且服务器应该从端口 y 响应端口 x,那么您需要将套接字绑定到所需的端口。或者,您可以使用构造函数进行绑定。不这样做会导致操作系统使用临时端口

此外,要获取从接收到数据包的远程端点,async_receive_from需要sender_endpoint参考参数。当调用读取处理程序时,您可以从中检索主机和端口。

于 2013-03-05T07:28:25.223 回答