컴퓨터의 로컬 네트워크 IP 주소를 프로그래밍 방식으로 어떻게 얻습니까?

StackOverflow https://stackoverflow.com/questions/151231

  •  02-07-2019
  •  | 
  •  

문제

C# 및 .NET 3.5를 사용하여 내 프로그램에서 컴퓨터의 실제 로컬 네트워크 IP 주소 (예 : 192.168.0.220)를 가져와야합니다. 이 경우 127.0.0.1 만 사용할 수 없습니다.

이것을하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

링크그것은 거기에, system.net을 추가하고 다음을 사용합니다.

    //To get the local IP address 
string sHostName = Dns.GetHostName (); 
IPHostEntry ipE = Dns.GetHostByName (sHostName); 
IPAddress [] IpA = ipE.AddressList; 
for (int i = 0; i < IpA.Length; i++) 
{ 
    Console.WriteLine ("IP Address {0}: {1} ", i, IpA[i].ToString ()); 
}

다른 팁

명령 줄 유틸리티 인 ipconfig가 제공 할 수있는 정보를 찾고 있다면 System.net.networkInformation 네임 스페이스를 사용해야 할 것입니다.

이 샘플 코드는 모든 네트워크 인터페이스를 열거하고 각 어댑터에 대해 알려진 주소를 덤프합니다.

using System;
using System.Net;
using System.Net.NetworkInformation;

class Program
{
    static void Main(string[] args)
    {
        foreach ( NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces() )
        {
            Console.WriteLine("Network Interface: {0}", netif.Name);
            IPInterfaceProperties properties = netif.GetIPProperties();
            foreach ( IPAddress dns in properties.DnsAddresses )
                Console.WriteLine("\tDNS: {0}", dns);
            foreach ( IPAddressInformation anycast in properties.AnycastAddresses )
                Console.WriteLine("\tAnyCast: {0}", anycast.Address);
            foreach ( IPAddressInformation multicast in properties.MulticastAddresses )
                Console.WriteLine("\tMultiCast: {0}", multicast.Address);
            foreach ( IPAddressInformation unicast in properties.UnicastAddresses )
                Console.WriteLine("\tUniCast: {0}", unicast.Address);
        }
    }
}

당신은 아마도 Unicastaddresses에 가장 관심이있을 것입니다.

DNS를 사용하려면 컴퓨터를 로컬 DNS 서버에 등록해야합니다. 이는 인트라 넷에있는 경우 반드시 사실이 아니며 ISP를 사용하는 경우에는 훨씬 적습니다. 또한 자신의 컴퓨터에 대한 정보를 찾기 위해서는 네트워크 왕복이 필요합니다.

적절한 방법 :

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach(NetworkInterface  adapter in  nics)
{
    foreach(var x in adapter.GetIPProperties().UnicastAddresses)
    {
        if (x.Address.AddressFamily == AddressFamily.InterNetwork  && x.IsDnsEligible)
        {
                    Console.WriteLine(" IPAddress ........ : {0:x}", x.Address.ToString());
        }
    }
}

(업데이트 2015 년 31 일 -2015 년 : 코드의 일부 문제를 해결했습니다)

또는 linq 라인만을 좋아하는 사람들을 위해 :

NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(adapter=> adapter.GetIPProperties().UnicastAddresses)
    .Where(adr=>adr.Address.AddressFamily == AddressFamily.InterNetwork  && adr.IsDnsEligible)
    .Select (adr => adr.Address.ToString());

컴퓨터에 여러 IP 주소가있을 수 있으므로 일반 인터넷으로 라우팅하는 데 사용할 IP 주소를 파악하는 올바른 방법은 인터넷의 호스트에 소켓을 열고 소켓 연결을 검사하는 것입니다. 그 연결에 사용되는 로컬 주소가 무엇인지 확인하십시오.

소켓 연결을 검사하면 이상한 라우팅 테이블, 여러 IP 주소 및 화려한 호스트 이름을 고려할 수 있습니다. 위의 호스트 이름의 속임수는 작동 할 수 있지만 완전히 신뢰할 수있는 것은 아닙니다.

컴퓨터에 하나 이상의 IPv4 주소가 있다는 것을 알고 있다면이 중 하나를 제공합니다.

Dns.GetHostAddresses(Dns.GetHostName())
    .First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString()

GetHostAddresses 일반적으로 DNS 서버를 쿼리하는 동안 호출 스레드를 차단하고 SocketException 쿼리가 실패하면 자신의 호스트 이름을 찾을 때 네트워크 호출을 건너 뛸지 여부는 모르겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top