C#socketバインドNIC接続
12200 ワード
の原因となる
工業制御を行うため、コンピュータには必ず複数のネットワークポートがあり、よく見られる接続タイプがあります.以上のカメラで、各カメラは個別のギガビットネットワークカードを使用し、6種類のネットワークケーブルを使用します. 各制御または呼び出しが必要な下位機; データをアップロードする上位機.
現場のネットワーク環境は複雑で、空にならない要素がたくさんあります.最も一般的なのは、下位機に接続するsocketがデータをアップロードするネットワークポートを通じて他の設備に接続され、私たちの設備の正常な運行に影響を与えることです.
結論
そのため、下位機に接続するためにNICをバインドする必要があります.
コードは次のとおりです.
最終的には、取得した「IPLocal」を使用してsocketをバインドし、下位機のIPアドレスで接続し、接続されたNICが正しいことを確認します.
工業制御を行うため、コンピュータには必ず複数のネットワークポートがあり、よく見られる接続タイプがあります.
現場のネットワーク環境は複雑で、空にならない要素がたくさんあります.最も一般的なのは、下位機に接続する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);//