Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用套接字的主动网络接口#_C#_Sockets_Networking_Interface_Wifi - Fatal编程技术网

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

C# 在C中使用套接字的主动网络接口#,c#,sockets,networking,interface,wifi,C#,Sockets,Networking,Interface,Wifi,我目前正在开发一个windows应用程序,它应该通过WiFi与远程嵌入式系统进行通信。Windows应用程序正在发送一条广播消息,远程装置正在接收该消息并从中提取发送方IP。然后,远程装置将应答发送回提取的IP。问题是,当发送广播消息时,C#正在使用无线网络连接,但当我打开一个套接字以侦听答案(或将消息发送到指定地址)时,它正在使用局域网连接。由于这些接口具有不同的IP地址,windows应用程序将无法从远程接收答案 所以我的问题是,为什么C#对不同的套接字使用不同的网络接口,有没有办法强迫程序

我目前正在开发一个windows应用程序,它应该通过WiFi与远程嵌入式系统进行通信。Windows应用程序正在发送一条广播消息,远程装置正在接收该消息并从中提取发送方IP。然后,远程装置将应答发送回提取的IP。问题是,当发送广播消息时,C#正在使用无线网络连接,但当我打开一个套接字以侦听答案(或将消息发送到指定地址)时,它正在使用局域网连接。由于这些接口具有不同的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

谢谢大家!

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

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


在发送广播消息之前,请确保将套接字设置为侦听响应,否则您可能会在侦听器设置之前收到竞争条件下的响应。

当您说
局域网连接时
我想您的意思是*有线网络连接?无线也可以连接到局域网。如果您正确配置了IP、子网掩码和网关,那么它应该能够自动将连接路由到您的目标地址。我指的是ipconfig中名为Local Area connection的网络接口。它通过电线连接到路由器。我不知道IP、子网掩码和网关是否配置正确,如何检查?谢谢您的回答。我意识到我的另一张网卡工作不正常。我通过发送多播而不是广播来解决这个问题,这样消息就从正确的网络接口(与远程设备进行所有其他通信的接口)发送。