C++ 绑定并连接的Boost.Asio数据报(UDP)套接字

C++ 绑定并连接的Boost.Asio数据报(UDP)套接字,c++,sockets,boost,udp,boost-asio,C++,Sockets,Boost,Udp,Boost Asio,我在理解Boost.Asio(使用v1.49.0)套接字背后的概念时遇到问题 首先,我要解释我想要实现的目标: 我将Boost.Asio套接字隐藏在一个非常简单的接口(纯抽象基类)后面,因此我有两个包装器类,允许访问流套接字或数据报套接字 在将Boost.Asio套接字传递给我的包装类的构造函数之前,我想同时配置本地端点和远程端点 我想使用socket.receive(或者boost::asio::read)和socket.send(或者boost::asio::write)成员函数而不是so

我在理解Boost.Asio(使用v1.49.0)套接字背后的概念时遇到问题

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

  • 我将Boost.Asio套接字隐藏在一个非常简单的接口(纯抽象基类)后面,因此我有两个包装器类,允许访问流套接字或数据报套接字
  • 在将Boost.Asio套接字传递给我的包装类的构造函数之前,我想同时配置本地端点和远程端点
  • 我想使用
    socket.receive
    (或者
    boost::asio::read
    )和
    socket.send
    (或者
    boost::asio::write
    )成员函数而不是
    socket.receive_from
    socket.send_to
    成员函数
  • 使用
    socket.send
    socket.receive
    的唯一方法似乎是连接套接字
UDP套接字既可以绑定也可以连接:

  • 绑定是通过成员函数实现的
  • 通过成员功能实现连接
问题是,即使我能够

  • 打开插座
  • 设置套接字选项
  • 绑好插座
  • 连接插座
  • 为了能够通过套接字发送数据,我不能从套接字接收数据。如果我没有连接套接字,我可以通过绑定的本地端点接收数据,但是我无法使用所描述的方法发送数据

  • 所以我的中心问题是:我是否在尝试一些不可能实现的事情
  • 我只能对一个套接字实例使用
    bind
    connect
  • 如果前面两个问题的答案是否定的:我必须做什么,才能通过绑定和连接的Boost.Asio UDP套接字接收和发送数据

  • 我知道UDP实际上是无连接的,因此本文使用Boost.Asio术语。我也读过,这似乎表明我所尝试的是不可能的。

    您在
    connect
    的手册页中遗漏了一点:

    如果socket sockfd为SOCK_DGRAM类型,则默认情况下,addr是数据报发送到的地址,并且是从中接收数据报的唯一地址

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

    如果需要从多个对等方接收数据,可以将udp套接字连接到“任意”地址(即0.0.0.0-udp::v4())和某些端口