2013-02-10 26 views
0

我正在開發一個在工業環境中通過局域網使用的點對點通信網絡。有些消息只是異步的,不需要響應。其他則是請求 - 迴應。請求消息(和異步消息)被髮送到多播組,並且對請求的回覆以單播方式發送。因此,每個端點接收發送到多播組的UDP數據包,並且還接收使用普通單播發送給它的消息。如何使用boost :: asio查找UDP數據包的目標地址?

到目前爲止,它工作正常,但似乎沒有任何方法在boost :: asio中找出接收到的UDP數據包的目標地址(使用socket.async_receive_from) - 它是否發送到多播組或實際的界面。我可以使用消息的內容來推斷它是發送多播還是單播,但是能夠檢查目的地址也是很好的。

我們目前正在使用Windows 7,但未來將會過渡到Linux。

有沒有辦法找到使用boost :: asio接收到的UDP數據包的目標地址?

回答

2

不幸的是,對於boost :: asio來說這是不可能的,而且通常不是「這樣做」的方法,因爲您試圖訪問Application Layer上的Transport Layer信息。

所以你基本上有兩種選擇:

a)寫出與非便攜式系統的代碼,例如IP_PKTINFO或SO_BINDTODEVICE在Linux上。示例代碼可以在boost asio郵件列表中找到here

b)使用兩個不同的套接字,一個用於多播,一個用於單播。因此,您需要在每個套接字上指定一個不同於「0.0.0.0」的listen_address。

udp::endpoint(address_v4::from_string("239.192.152.143"), 6771) 

在這個問題上也是如此可能會有所幫助:Using a specific network interface for a socket in windows

+0

感謝@漢內斯·米。我想我會選擇選項c)編寫代碼(和消息),以便消息是接收多播還是單播都無關緊要。 – cdjc 2013-02-12 01:00:01

相關問題