2012-09-25 217 views
6

我知道這個問題已被問了很多次。我已閱讀所有答案並嘗試了EVRY我能找到的一段代碼。幾天後,我非常絕望,我不得不請求你的幫助。接收UDP廣播消息在C#

我的家庭網絡中有一臺設備和一臺PC。設備發送UDP廣播消息。在我的電腦我可以看到Wireshark的那些消息:

源目標長度

192.168.1.102 0.0.0.0 UDP 60源端口:9050目的端口:0

這意味着數據包到達我PC。我的下一步是創建一個接收這些數據包的C#應用​​程序。如上所述,我嘗試了所有可能的解決方案,但它不會收到任何東西。

所以我想必須有一些非常基本的東西我做錯了。 任何人都可以幫我嗎?謝謝!

+1

你可以發佈你用來偵聽數據包的代碼嗎? – tomasmcguinness

+0

我嘗試了以下代碼:http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/和http://www.java2s.com/Code/CSharp/Network/ReceiveBroadcast。 HTM和也http://stackoverflow.com/questions/746519/udpclient-receive-on-broadcast-address – Boris

+0

任何主動防火牆?我不確定Wireshark截取哪些軟件包的位置,但可能是因爲防火牆會阻止它們。 – Default

回答

0

你沒問題,他們在導致問題的代碼中連接了一些東西。 (我沒有看過這篇文章,只是複製粘貼)

它總是從本地機器上運行,但是從遠程機器上它會因爲某種原因失敗。

修復此問題: 在Broadcst.cs中他們廣播了兩次。一次用於本地主機,然後用於目標IP地址(iep2)。只需刪除

sock.SendTo(data, iep1); 

它應該工作。

不知道爲什麼。

1

剛剛經歷過同樣的問題,並且想分享一下爲我解決的問題。

簡而言之:看起來Windows防火牆在某種程度上是造成這種奇怪行爲的原因,只是禁用該服務並沒有幫助。 您必須在Windows防火牆入站規則列表中明確允許傳入的UDP數據包用於特定程序(可執行文件)。

有關完整的案例描述,請繼續閱讀。

我的網絡設置是:我的(接收)機器的IP是192.168.1.2,發送機器的IP是192.168.1.50,兩臺機器上的子網掩碼是255.255.255.0。 我的機器正在運行Windows 7 x64。

這是我使用的代碼(大約):

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); 
sock.Bind(iep); 
sock.EnableBroadcast = true; 
EndPoint ep = (EndPoint)iep; 
byte[] buffer = new byte[1000]; 
sock.ReceiveFrom(buffer, ref ep); 

最初,這沒有工作除非我從插座發送廣播包我稱之爲ReceiveFrom在它之前。即加入這一行之前ReceiveFrom電話:

sock.SendTo(someData, new IPEndPoint(IPAddress.Broadcast, somePort)) 

當我沒有從接收插座中發送廣播包,進來的廣播數據包沒有被收到,即使他們在Wireshark的出現(數據包的目的地是255.255。 255.255)。我認爲它看起來像防火牆搞亂了傳入數據包(除非某些類型的UDP數據包首先被傳出數據包打開 - 即使我之前沒有聽說過UDP數據包穿孔應用於廣播數據包),所以我去服務和完全禁用Windows防火牆服務。這沒有改變。

但是,在嘗試了其他一切後,我重新啓用了防火牆服務,並試圖再次運行該程序。這一次,防火牆提示出現問我是否要通過防火牆允許MyProgram.vshost.exe進程(我在Visual Studio中進行調試),我接受了它,並且瞧 - 一切正常!傳入的數據包正在被接收!