C#socketバインドNIC接続

12200 ワード

の原因となる
工業制御を行うため、コンピュータには必ず複数のネットワークポートがあり、よく見られる接続タイプがあります.
  • 以上のカメラで、各カメラは個別のギガビットネットワークカードを使用し、6種類のネットワークケーブルを使用します.
  • 各制御または呼び出しが必要な下位機;
  • データをアップロードする上位機.

  • 現場のネットワーク環境は複雑で、空にならない要素がたくさんあります.最も一般的なのは、下位機に接続するsocketがデータをアップロードするネットワークポートを通じて他の設備に接続され、私たちの設備の正常な運行に影響を与えることです.
    結論
    そのため、下位機に接続するためにNICをバインドする必要があります.
    コードは次のとおりです.
    				string BindMac ="AAAAAAAAAA";//            
    				string IPLocal = string.Empty;
                    IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties();
                    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
                    Console.WriteLine("Interface information for {0}.{1}     ",
                            computerProperties.HostName, computerProperties.DomainName);
                    foreach (NetworkInterface adapter in nics)
                    {
                        IPInterfaceProperties properties = adapter.GetIPProperties();
                        Console.WriteLine(adapter.Description);
                        Console.WriteLine(String.Empty.PadLeft(adapter.Description.Length, '='));
                        Console.WriteLine("  Interface type .......................... : {0}", adapter.NetworkInterfaceType);
                        Console.WriteLine("  Physical Address ........................ : {0}",
                                                adapter.GetPhysicalAddress().ToString());
                        Console.WriteLine("  Is receive only.......................... : {0}", adapter.IsReceiveOnly);
                        Console.WriteLine("  Multicast................................ : {0}", adapter.SupportsMulticast);
    
                        //       
                        UnicastIPAddressInformationCollection ipCollection = properties.UnicastAddresses;
                        foreach (UnicastIPAddressInformation ipadd in ipCollection)
                        {
                            if (ipadd.Address.AddressFamily == AddressFamily.InterNetwork)
                            {
                                string ipv44 = ipadd.Address.ToString();//  ip
                                string mac = adapter.GetPhysicalAddress().ToString();
                                Console.WriteLine("IP:{0}\tMac:{1}", ipv44, mac);
                                if (mac == BindMac)
                                {
                                    IPLocal = ipv44;
                                    break;
                                }
                            }
                            else if (ipadd.Address.AddressFamily == AddressFamily.InterNetworkV6)
                            {
                                //  IPV6   
                            }
                        }
                        if (!string.IsNullOrEmpty(IPLocal)) break;
    
                        Console.WriteLine();
                    }
    

    最終的には、取得した「IPLocal」を使用してsocketをバインドし、下位機のIPアドレスで接続し、接続されたNICが正しいことを確認します.
    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    connectSuccess = false;
    socket.Bind(new IPEndPoint(IPAddress.Parse(IPLocal), 0)); //           IP
    socket.Connect(System.Net.IPAddress.Parse(IPAdress), Port);//