【问题标题】:Boost.Asio datagram (UDP) socket that is both bound and connectedBoost.Asio 数据报 (UDP) 套接字,既绑定又连接
【发布时间】:2014-08-29 10:32:38
【问题描述】:

我无法理解 Boost.Asio(使用 v1.49.0)boost::asio::ip::udp::socket 套接字背后的概念。

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

  • 我将 Boost.Asio 套接字隐藏在一个非常简单的接口(纯抽象基类)后面,所以我有两个允许访问流套接字或数据报套接字的包装类。李>
  • 我想在将 Boost.Asio 套接字传递给我的包装类的构造函数之前配置本地端点远程端点。
  • 我想使用socket.receive(或者boost::asio::read)和socket.send(或者boost::asio::write)成员函数来代替socket.receive_fromsocket.send_to成员函数。
  • socket.sendsocket.receiveboost::asio::ip::udp::socket 一起使用的唯一方法似乎是连接套接字。

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

问题是,即使我能做到

  1. 打开套接字,
  2. 设置套接字选项,
  3. 绑定套接字,
  4. 连接插座,

为了能够通过套接字发送数据,我无法从套接字接收数据。如果我不连接套接字,我可以通过绑定的本地端点接收数据,但我无法通过所描述的方法发送数据。

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

我知道 UDP 实际上是无连接的,因此本文使用 Boost.Asio 术语。我还阅读了connect on "connection less" boost::asio::ip::udp::socket,这似乎表明我正在尝试是不可能的。

【问题讨论】:

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


    【解决方案1】:

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

    如果套接字 sockfd 是 SOCK_DGRAM 类型,则 addr 是默认发送数据报的地址,并且是接收数据报的唯一地址

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-28
      • 1970-01-01
      • 2019-09-05
      • 2011-02-27
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      相关资源
      最近更新 更多