Boost.Asio数据报(UDP)套接字既绑定又连接

时间:2014-08-29 10:32:39

标签: c++ sockets boost udp boost-asio

我在理解Boost.Asio(使用v1.49.0)boost::asio::ip::udp::socket套接字背后的概念时遇到了问题。

首先,我要解释一下我想要实现的目标:

  • 我将Boost.Asio套接字隐藏在一个非常简单的接口( Pure Abstract Base Class )后面,所以我有两个包装类允许访问流套接字或数据报套接字。
  • 我想在将 Boost.Asio 套接字传递给我的包装类的构造函数之前,配置本地端点远程端点。
  • 我想使用socket.receive(或boost::asio::read)和socket.send(或boost::asio::write)成员函数,而不是socket.receive_from和{{1}成员函数。
  • socket.send_tosocket.sendboost::asio::ip::udp::socket一起使用的唯一方法似乎是连接套接字。

UDP套接字既可以绑定也可以连接:

问题是,即使我能够

  1. 打开插座,
  2. 设置套接字选项,
  3. 绑定插座,
  4. 连接插座,
  5. 并且为了能够通过套接字发送数据,我无法从套接字接收数据。如果我没有连接套接字,我可以通过绑定的本地端点接收数据,但是我无法使用所描述的接近方式发送数据。

    1. 所以我的核心问题是:我是否尝试过无法实现的目标?
    2. 我是否只能将socket.receive bind与一个套接字实例一起使用?
    3. 如果前面两个问题的答案是否定的:我需要做什么,才能通过绑定和连接的Boost.Asio UDP套接字接收和发送数据。
    4. 我知道UDP实际上是无连接的,因此文本使用Boost.Asio术语。我也读过connect on "connection less" boost::asio::ip::udp::socket,这似乎表明我不可能尝试。

1 个答案:

答案 0 :(得分:3)

您在connect的手册页中缺少一点:

  

如果套接字sockfd的类型为SOCK_DGRAM,则 addr 默认情况下将数据报发送到的地址,以及仅接收数据报的地址。< / p>

这意味着,如果您想要connect套接字,那么它将只能从远程端点(连接的端点)接收数据报,即在将数据报发送到您的数据报之前,对等体必须绑定自己的套接字套接字等待数据。

如果您需要从多个对等方接收数据,可以将udp socket连接到&#34;任何&#34;地址(即0.0.0.0 - udp :: v4())和一些端口。