C#中使用套接字的活动网络接口

时间:2012-10-22 16:44:16

标签: c# sockets networking interface wifi

我目前正在开发一个应用程序,它应该通过WiFi与远程嵌入式系统进行通信。 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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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