我目前正在开发一个应用程序,它应该通过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
谢谢!
答案 0 :(得分:0)
如果要强制它在无线适配器上接收,请设置一个更具体的IPEndPoint引用您的无线适配器:
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("wireless adapter IP here"), 9999);
IPAddress.Any
应该,据我所知,听取所有接口,不只是选择最高优先级,所以你应该得到无线适配器上的响应数据包你设置它的方式。我想你可以尝试使用上面的代码强制它,如果它仍然不起作用,那么你的响应UDP消息就会被某个地方吞没。
确保在发送广播消息之前设置套接字以侦听响应,否则您可能会在设置侦听器之前获得实际响应的竞争条件。