2014-08-29 83 views
1

我在理解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_fromsocket.send_to成員函數。
  • 使用socket.sendsocket.receiveboost::asio::ip::udp::socket的唯一方式似乎是連接套接字。

UDP套接字都可以結合並連接:

的問題是,即使我能

  1. 打開插座,
  2. 設置套接字選項,
  3. 綁定插座,
  4. 連接插座,

並且能夠通過套接字發送數據,我無法從套接字接收數據。如果我沒有連接套接字,我可以通過綁定的本地端點接收數據,但我無法使用接近的描述發送數據。

  1. 所以我的核心問題是:我在嘗試一些不可能實現的事情嗎?
  2. 我只能使用bindconnect帶一個套接字實例嗎?
  3. 如果前兩個問題的答案是否定的:我必須做什麼才能通過綁定和連接的Boost.Asio UDP套接字接收和發送數據。

我知道UDP實際上是無連接的,因此文本使用了Boost.Asio術語。我也讀connect on "connection less" boost::asio::ip::udp::socket這似乎表明,我不可能嘗試。

回答

3

你缺少從connect手冊頁的一個觀點:

如果插座的sockfd是SOCK_DGRAM類型,然後addr是到數據報默認發送地址,並且唯一地址從中收到數據報

這意味着,如果你想connect插座,那麼這將是隻能從遠程端點(連接的一個),即對將在發送數據報給您的插座前,自己的套接字綁定接收數據報等待數據。

如果您需要接收來自多個對等方的數據,可以將udp套接字連接到「any」地址(即0.0.0.0 - udp :: v4())和某個端口。