簡體   English   中英

C#中使用套接字的活動網絡接口

[英]active network interface using Sockets in 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.Any偵聽所有接口,而不僅僅是選擇最高優先級的接口,因此您應該以設置方式在無線適配器上獲取響應數據包。 我猜您可以嘗試使用上面的代碼強制執行此操作,如果仍然無法執行操作,則您的響應UDP消息只是被吞沒了。

在發送廣播消息之前,請確保將套接字設置為偵聽響應,否則,您可能會遇到競態條件,其中的響應實際上是在設置偵聽器之前發生的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM