簡體   English   中英

綁定和連接的Boost.Asio數據報(UDP)套接字

[英]Boost.Asio datagram (UDP) socket that is both bound and connected

我在理解Boost.Asio(使用v1.49.0) boost::asio::ip::udp::socket套接字背后的概念時遇到了問題。

首先,我要解釋一下我想要實現的目標:

  • 我將Boost.Asio套接字隱藏在一個非常簡單的接口( Pure Abstract Base Class )后面,因此我有兩個包裝器類,它們可以訪問流套接字或數據報套接字。
  • 在將Boost.Asio套接字傳遞給包裝類的構造函數之前,我想同時配置本地端點遠程端點。
  • 我想使用socket.receive (或者boost::asio::read )和socket.send (或者boost::asio::write )成員函數,而不是socket.receive_fromsocket.send_to成員函數。
  • 通過boost::asio::ip::udp::socket使用socket.sendsocket.receive的唯一方法似乎是連接套接字。

UDP套接字可以綁定和連接:

問題是,即使我能夠

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

並且為了能夠通過套接字發送數據,我無法從套接字接收數據。 如果不連接套接字,則可以通過綁定的本地端點接收數據,但是無法使用上述方法發送數據。

  1. 所以我的中心問題是:我是否正在嘗試一些無法實現的事情?
  2. 我只能使用bind 與一個套接字實例connect嗎?
  3. 如果對前兩個問題的回答是否定的:我必須做什么,才能通過綁定並連接的Boost.Asio UDP套接字接收和發送數據。

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

您在connect手冊頁中遺漏了一點:

如果套接字sockfd的類型為SOCK_DGRAM,則addr是默認情況下向其發送數據報的地址,並且是唯一從其接收數據報的地址

這意味着,如果您想connect套接字,那么它將只能從遠程端點(已連接的端點)接收數據報,即對等方將必須綁定自己的套接字,然后才能將數據報發送到套接字以等待數據。

如果需要從多個對等方接收數據,則可以將udp套接字連接到“任意”地址(即0.0.0.0-udp :: v4())和某個端口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM