2014-02-06 53 views
0

我需要一些C#(一台服务器和一个客户端)例程,它允许我从PC上找到连接到子网的(WinCE)设备。尽管测试了几个例子,但我无法使广播工作。广播没有到达主机

运行在设备上有C#(Compact框架)基于服务器,其代码如下所示:

public void SomeClass() 
{ 

    IPEndPoint ipUDP = new IPEndPoint(IPAddress.Any, 5003); 
    this.serverUDP = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
    this.serverUDP.Bind(ipUDP); 
    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 6001); 
    this.epSender = (EndPoint)sender; 
    this.serverUDP.BeginReceiveFrom(this.bufferUDP, 0, 20, SocketFlags.None, ref epSender, new AsyncCallback(someMethod), null); 
} 

在PC,我运行一个客户端,应该调用这些服务器广播消息:

public static void Discover(ref string mensaje, string IPDestino, ref ArrayList equipos) 
{    
    UdpClient client = null; 
    try 
    { 
     client = new UdpClient(6001); 

     byte[] toSend = Encoding.ASCII.GetBytes("FINDSTT"); 
     client.Send(toSend, toSend.Length, "255.255.255.255", 5003); 

     //Some logic 
    } 
    catch (Exception ex) 
    { 
     //Some handling 
    } 
    if (client != null) 
     client.Close(); 
} 

问题是广播从未到达服务器。但是,如果我在client.Send()中更改了特定地址的广播地址(255.255.255.255),它将被服务器接收。但是这样,我失去了主要的目标,那就是找到我以前不知道的设备。

+0

如果您在服务器上运行一个数据包捕获,你看到你的任何产生的广播流量的? (而且,更重要的是,我认为客户端和服务器在同一个逻辑网络上?) – admdrew

+0

您的客户端是否在Windows 7上运行? – OnoSendai

+0

从不调用AsyncCallback(在代码“someMethod”中调用)。如果有数据出现,它应该被调用。在这种情况下,PC和WinCE设备通过以太网连接到同一交换机。 – Ferite

回答

0

如果您的客户端在Windows 7/8下运行,则问题可能出在操作系统处理零网络广播地址255.255.255.255的方式。如果是这样的话,那么this post may be of some help to you

此外,相关:

How to fix the global broadcast address (255.255.255.255) behavior on Windows?(的Technet,Win7的)

IPv4 broadcast problem(win8的)

+0

你的aswer解决了问题的一半。有效地,广播没有被发送给所有适配器。这可以通过安装WinIPBroadcast来解决:https://github.com/dechamps/WinIPBroadcast – Ferite

+0

@OnoSendsai,你的回答解决了我最初的问题。实际上,所有适配器都没有发送广播。这可以通过安装我在其中一个链接中找到的服务来解决: https://github.com/dechamps/WinIPBroadcast。 – Ferite

+0

@Ferite很好听。我在过去遇到同样的问题,我通过编程映射网络接口并通过每个接口发送(这里是双关语)单个广播数据包来解决此问题。 – OnoSendai