簡體   English   中英

提升asio - udp服務器

[英]Boost asio - udp server

我在boost doc中看到了官方的異步udp服務器示例。 在那里你創建一個單獨的udp套接字,將它綁定到本地端口並執行以下操作:

socket(ioService, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port))

socket.async_receive_from(buffer(data, max_length), senderEndpoint, boost::bind(&Request::HandleReceiveFrom, this,
    boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));

如何處理來自客戶端的多個並發udp連接,因為如果我嘗試使用創建另一個套接字

socket(ioService, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port))

我得到綁定錯誤,因為我已經有一個綁定到同一端口的套接字。

編輯我可以使用不同的服務器源端口向客戶端發回響應,但即使我將響應發送回相同的客戶端IP /客戶端目標端口,它們也無法識別響應。

UDP是無連接傳輸,因此就UDP而言,連接的概念毫無意義。

如果要將數據發送回消息的發起者,則需要保留async_receive_from回調中返回的sender_endpoint的副本,並將其傳回async_send_to。

這也假設客戶端也在輪詢/閱讀並期待回復。 它不需要監聽與服務器相同的綁定端口(您不需要在客戶端與UDP綁定)。

我建議您閱讀Beej的網絡編程指南,以幫助您了解boost ASIO的內容。 Boost ASIO讓很多事情變得復雜恕我直言。

http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#sendtorecv

如果您的客戶端將其消息發送到服務器上的同一端口,則區分它們的唯一方法是通過遠程端口或遠程端口和遠程IP的組合。

您可以創建某種從client-id(例如pair<remote_ip, remote_port> )到調度程序類型的map< pair<remote_ip, remote_port>, dispatcher> (例如map< pair<remote_ip, remote_port>, dispatcher> )。 然后由您自行決定是否支持並發請求。

因為看起來解決方案似乎可以使用相同的套接字將響應發送回客戶端。 看看這個問題的答案: 使用相同的udp套接字進行異步接收/發送

暫無
暫無

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

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