2012-09-25 62 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中进行调试),我接受了它,并且瞧 - 一切正常!传入的数据包正在被接收!