绑定并连接的Boost.Asio数据报(UDP)套接口
问题描述:
我在理解Boost.Asio(使用v1.49.0)boost::asio::ip::udp::socket
套接字背后的概念时存在问题。绑定并连接的Boost.Asio数据报(UDP)套接口
首先我会向我解释想达到的目标:
- 我躲在一个非常简单的接口(纯抽象基类),所以我有两个包装类Boost.Asio的插座它允许访问流套接字或数据报套接字。
- 我想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套接字都可以结合并连接:
- 绑定经由
socket.bind
成员函数来实现的。 - 连接是通过
socket.connect
成员函数实现的。
的问题是,即使我能
- 打开插座,
- 设置套接字选项,
- 绑定插座,
- 连接插座,
并且能够通过套接字发送数据,我无法从套接字接收数据。如果我没有连接套接字,我可以通过绑定的本地端点接收数据,但我无法使用接近的描述发送数据。
- 所以我的核心问题是:我在尝试一些不可能实现的事情吗?
- 我只能使用
bind
或connect
带一个套接字实例吗? - 如果前两个问题的答案是否定的:我必须做什么才能通过绑定和连接的Boost.Asio UDP套接字接收和发送数据。
我知道UDP实际上是无连接的,因此文本使用了Boost.Asio术语。我也读connect on "connection less" boost::asio::ip::udp::socket这似乎表明,我不可能尝试。
答
你缺少从connect
手册页的一个观点:
如果插座的sockfd是SOCK_DGRAM类型,然后addr是到数据报默认发送地址,并且唯一地址从中收到数据报。
这意味着,如果你想connect
插座,那么这将是只能从远程端点(连接的一个),即对将在发送数据报给您的插座前,自己的套接字绑定接收数据报等待数据。
如果您需要接收来自多个对等方的数据,可以将udp套接字连接到“any”地址(即0.0.0.0 - udp :: v4())和某个端口。