【问题标题】:The boost asio endpoint classboost asio 端点类
【发布时间】:2019-03-20 18:33:11
【问题描述】:

如 boost 文档中所述:

ip::basic_endpoint::port (1 of 2 overloads)
unsigned short port() const;

此 getter 获取与端点关联的端口。 端口号始终按主机的字节顺序排列。

我知道 Little-endian 字节排序将最低有效字节放在首位。 但是,Big-endian 字节排序将最重要的字节放在首位。

在 C 语言中,我们使用这些函数:

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

如何在 boost asio 中获取正确的端口号?

谢谢

【问题讨论】:

  • 进一步思考:函数的命名很好地证实了我的回答:在 C 语言中,您可以调用 ntoh 将网络字节顺序转换为主机字节顺序。如您所见,这里没有必要,因为这已经完成(该值保证按主机顺序排列,这是唯一“正确”的值 - 即使它在线路上看起来可能不同)。

标签: networking boost boost-asio


【解决方案1】:

https://www.boost.org/doc/libs/1_69_0/doc/html/boost_asio/reference/ip__basic_endpoint/port.html

此 getter 获取与端点关联的端口。端口号始终按主机的字节顺序排列。

因此,由于您在该主机上调用该函数,因此只需调用该函数即可返回正确的端口。

我想这个“奇怪”的评论是在库的作者实现某些协议的较低层/考​​虑原始套接字时出现的。如果您正在实施特定协议,您需要将其转换为网络字节顺序,这只是一个警告。这使得注释在basic_endpoint 提供的抽象级别上几乎完全是多余的,但谁知道也许有人在实施(专门化)它时忘记遵守。

【讨论】:

  • 我不是这样。这是我的示例:./udp_client 30000:使用端口 3000(c 客户端)向服务器发送数据报。/udp_server 输出:发送到客户端的回复:端口 45227 这是代码:`void handle_send(boost::shared_ptr 消息,const boost::system::error_code& 错误,std::size_t bytes_transferred) { std::cout
  • 我在那个乱七八糟的评论中看不到任何东西。你为什么不把这个例子添加到问题中,在哪里可以正确格式化并包含代码?
  • 同时我的袖珍计算器 (bash) 说这不太可能是字节序问题:i.imgur.com/9FsEFin.png
  • 是的,不是,这里的问题是使用的协议是无连接的。
  • @RogerWorld 如果你重新提出这个问题,也许你的答案会在未来帮助其他人,所以继续发帖
【解决方案2】:

问题在于 UDP 是一种无连接协议。所以remote_endpoint在发送数据后持有垃圾。

证明这一点的代码

boost::system::error_code ec;
boost::asio::ip::udp::endpoint endpoint = socket.remote_endpoint(ec);
if(ec)
{
    std::cout << "An error occurred." << '\n';
    std::cout << ec.value() << " " << ec.message() << '\n';
    return;
}

输出:

发生错误。 107 传输端点未连接

【讨论】:

  • 你为什么在socket上使用remote_endpoint?如果您通过async_send_to 发送数据,您需要定义发送数据的端点,不是吗?所以你知道远程端点。当您通过async_receive_from 读取数据时,您也知道发送者的端点,因为您必须传递由发送者地址填充的端点对象。
  • @rafix07 为什么在套接字上使用 remote_endpoint:是的,我需要它,因为我有一个服务器,所以我想知道哪个客户端正在向我发送数据。如果您通过 async_send_to 发送数据,则需要定义发送数据的端点,不是吗?:我没有定义任何端点,它是通过 async_receive_from 方法传输的。到目前为止,我无法从 remote_endpoint(发送方,即客户端)恢复端口)
  • 在服务器端创建socket。您需要将其绑定到某个端口 - X 才能收听。客户端知道必须在哪里连接,因此它使用端点调用async_send_to,端点的服务器IP 和X 端口。在服务器上,您调用async_receive_from 传递空端点(由客户端地址填充),然后您从端点读取端口并且您知道数据来自哪里。
  • 是的,但是对于无连接的 udp,在 async_receive_from 异步方法之后执行的处理程序没有 remote_endpoint 作为参数。 void handler( const boost::system::error_code& error, // 操作结果。std::size_t bytes_transferred // 接收到的字节数。);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多