我无法理解 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_from
和socket.send_to
成员函数。 - 将
socket.send
和socket.receive
与boost::asio::ip::udp::socket
一起使用的唯一方法似乎已连接套接字。
UDP 套接字既可以绑定(bind)也可以连接:
- 绑定(bind)是通过
socket.bind
实现的成员函数。 - 通过
socket.connect
实现连接成员函数。
问题是,即使我能够
- 打开套接字,
- 设置套接字选项,
- 绑定(bind)套接字,
- 连接 socket ,
并且能够通过套接字发送数据,但我无法从套接字接收数据。如果我不连接套接字,我可以通过绑定(bind)的本地端点接收数据,但无法使用所描述的方法发送数据。
- 所以我的核心问题是:我是否在尝试一些不可能实现的事情?
- 我只能对一个套接字实例使用
bind
或connect
吗? - 如果前两个问题的答案是否定的:我必须做什么才能通过绑定(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/