2016-10-20 39 views
2

首先讓我說,我不知道的狀態,如果這是一個OSX問題,或者我離開出來的東西不recieving廣播:二郎gen_udp時{IP,地址} specificed Socket的

目標我需要指定用於UDP通信的接口適配器,以避免與使用相同端口的其他軟件衝突。 (將有2個網絡適配器)。

問題:當{IP,地址}選項中指定gen_udp

接口適配器,但是它的工作原理,當我不使用{IP,地址}選項無法按預期接收廣播消息。我收到發送到255.255.255.255或192.168.1.255(都是工作)的廣播消息。

{ok,Socket} = gen_udp:open(Port,[{broadcast, true},{reuseaddr, true}]). 

一旦我添加了{ip,Address}選項來指定使用哪個接口適配器,它將停止接收廣播。我可以通過wireshark看到消息,但套接字沒有收到它們。

{ok,Socket} = gen_udp:open(Port,[{broadcast, true},{reuseaddr, true},{ip,Address}]). 

我注意到在沒有使用{ip,Address}選項的情況下,Socket的地址爲{0,0,0,0}。通過inet:sockname(Socket)。

我在想什麼?

+0

當插座綁定到0.0.0.0它將從任何接口接收。你確定當你使用{ip,Address}時,數據包被髮送到你綁定的接口嗎? –

+0

當我使用wireshark並選擇了目標接口({ip,Address}的接口)時,我可以看到廣播信息包。所以我假設數據包正在發送併到達接口。如預期的那樣,它們出現在wireshark目的地爲255.255.255.255的地方,這與Address不同。所以我認爲它們被忽略或者沒有被socket處理,因爲它們不匹配。當我不使用{ip,Address}但Socket接收數據時,我看到了同樣的情況。 – casillic

回答

1

爲了獲得廣播包,你必須綁定套接字連接到broadcast address例如,如果你想獲得廣播接口lo在一般的UNIX設置,您可以設置Address{127,255,255,255}

{ok, IfList} = inet:getifaddrs(), 
{_, LoOpts} = proplists:lookup("lo", IfList), 
{_, Address} = proplists:lookup(broadaddr, LoOpts) 
+0

所以我必須使用兩個插座,這並不理想,但仍然可行。 {broadcast,true}選項似乎僅用於從未收到的套接字發送廣播信息。我用兩個套接字修改了我的代碼,一個處理廣播接收,另一個處理正常通信。有用。謝謝! – casillic