从Boost Asio udp :: endpoint恢复端口

时间:2013-03-05 02:50:17

标签: networking boost udp boost-asio endianness

我正在编写一个服务器和客户端程序,使用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端口?显然它必须存在于某处,因为它们正在成功通信。 在此先感谢,如果noob错误,抱歉:)

1 个答案:

答案 0 :(得分:3)

Fistly,UDP是无连接的,没有连接

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

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