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

标签 c++ sockets boost udp boost-asio

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

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

  • 我将 Boost.Asio 套接字隐藏在一个非常简单的接口(interface)(纯抽象基类)后面,因此我有两个包装类,允许访问流套接字或数据报套接字。<
  • 我想在将 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 套接字既可以绑定(bind)也可以连接:

问题是,即使我能够

  1. 打开套接字,
  2. 设置套接字选项,
  3. 绑定(bind)套接字,
  4. 连接 socket ,

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

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

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

最佳答案

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

If the socket sockfd is of type SOCK_DGRAM, then addr is the address to which datagrams are sent by default, and the only address from which datagrams are received.

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

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

关于c++ - 绑定(bind)并连接的 Boost.Asio 数据报 (UDP) 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25566519/

相关文章:

c++ - 类模板中封闭类型的静态数组

c++ - 没有 Emscripten,如何使用标准库将 C++ 编译为 WebAssembly

java - 如何取消阻塞在 ServerSocket.accept() 上阻塞的线程?

node.js - 将共享对象附加到Socket.io Room

c++ - 是否可以将 boost::any 或 boost::variant 与 boost::pool 一起使用?

c++ - boost 库 vc100

C++ BOOST ForEach 与自定义宏

c++ - 与二维数组中的 .bmp 的简单碰撞?

c++ - Socket 客户端始终连接到本地主机

c++ - 在 Solaris 上构建 Boost