剛剛經歷過同樣的問題,並且想分享一下爲我解決的問題。
簡而言之:看起來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中進行調試),我接受了它,並且瞧 - 一切正常!傳入的數據包正在被接收!
來源
2014-03-05 23:52:33
lxa
你可以發佈你用來偵聽數據包的代碼嗎? – tomasmcguinness
我嘗試了以下代碼: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
任何主動防火牆?我不確定Wireshark截取哪些軟件包的位置,但可能是因爲防火牆會阻止它們。 – Default