1

我目前正在开发一个应该通过 WiFi 与远程嵌入式系统通信的 Windows 应用程序。Windows 应用程序正在发送一个广播消息,远程单元正在接收该消息并从中提取发送者 IP。然后,远程单元将答案发送回提取的 IP。问题是,在发送广播消息时,C# 使用的是无线网络连接,但是当我打开一个 Socket 来监听答案(或向指定地址发送消息)时,它使用的是本地连接。由于这些接口具有不同的 IP 地址,Windows 应用程序不会从远程接收到答案。

所以我的问题是,为什么 C# 对不同的套接字使用不同的网络接口,有没有办法强制程序对所有套接字使用相同的接口?

这是发送广播消息的代码

    sockB = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp);    //Create a UDP socket
    sockB.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);        //Enable broadcast on socket
    IPEndPoint briep = new IPEndPoint(IPAddress.Broadcast, 9584);                            //Relate a port to the broadcast address    
    byte[] dat = { 0xAD, 0xEE, BRDCST_CMND, (byte)(0xAD ^ 0xEE ^ BRDCST_CMND) };           //Put in buffer
    sockB.SendTo(dat, briep);              //Broadcast data

这是从遥控器中收听答案的代码

    sockC = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);                 //Create an udp socket
    sockC.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1);                 //set timeout to 5 ms
    sockC.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1);
    IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9999);             //set up an "any" ip address and associate it with port 9854        
    EndPoint ep = (EndPoint)(iep);                                      //Make an endpoint out of previous association
    sockC.Bind(iep);                             //Bind the created socket to listen on port 9854
    byteRecv = sockC.ReceiveFrom(data, ref ep);                  //Receive on socke

谢谢!

4

1 回答 1

0

如果您想强制它在您的无线适配器上接收,请设置一个指向您的无线适配器的更具体的 IPEndPoint:

IPEndPoint iep = new IPEndPoint(IPAddress.Parse("wireless adapter IP here"), 9999);

IPAddress.Any 据我所知,应该监听所有接口,而不仅仅是选择最高优先级的接口,因此您应该按照设置的方式在无线适配器上获取响应数据包。我想你可以尝试使用上面的代码强制它,如果它仍然不起作用,那么你的响应 UDP 消息只是被某个地方吞没了。

确保在发送广播消息之前设置套接字以侦听响应,否则您可能会遇到在设置侦听器之前响应实际出现的竞争条件。

于 2012-10-22T17:11:43.720 回答