C # 응용 프로그램이 실행되는 서버의 IP 주소를 얻는 방법은 무엇입니까?


365

서버를 실행 중이며 내 자신의 IP 주소를 표시하고 싶습니다.

컴퓨터 자체 (가능한 경우) 외부 IP 주소를 얻는 구문은 무엇입니까?

누군가 다음 코드를 작성했습니다.

IPHostEntry host;
string localIP = "?";
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
    if (ip.AddressFamily.ToString() == "InterNetwork")
    {
        localIP = ip.ToString();
    }
}
return localIP;

그러나 나는 일반적으로 저자를 불신하며이 코드를 이해하지 못한다. 더 좋은 방법이 있습니까?


1
외부 IP 주소와 관련하여 로컬 검색 방법이 있다고 생각하지 않습니다. 로컬 호스트가 로컬 네트워크 주소를 공용 주소로 변환하는 NAT 라우터 뒤에있을 수 있습니다. 그것이 사실인지 확인하는 (로컬) 방법이 있습니까? 나는 어떤 ... 모르겠어요
티아고 Arrais

샘플은 DNS를 사용하여 IP 주소를 얻습니다. DNS에 잘못된 정보가있는 경험이 있습니다. 이 경우 샘플이 잘못된 정보로 응답 할 수 있습니다.
leiflundgren

@leiflundgren 또한 DNS에 잘못된 정보가있는 경험이 있습니다. 내 대답은 그 상황에 직면했을 때 DNS에 의존하지 않고 필요한 IP 주소를 얻는 방법을 설명합니다.
Dr. Wily 's Apprentice

13
LINQ 사용 :Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
Luis Perez

2
이것은 완전히 다른 요구를 가진 사용자가 동일한 질문을하는 경향이있는 전형적인 상황입니다. 일부 사람들은 공용 네트워크에서 자신의 컴퓨터에 어떻게 접근 할 수 있는지 알고 싶어합니다. 정식 답변은 STUN 이지만 많은 사람들이 임의의 제 3 자에 의존하는 해킹으로 답변합니다. 일부 사람들은 로컬 네트워크에서 자신의 IP 주소를 알고 싶어합니다. 이 경우 좋은 대답은 NetworkInterface.GetAllNetworkInterfaces Method 입니다.
Stéphane Gourichon

답변:


237

아니, 그게 가장 좋은 방법입니다. 머신에 여러 개의 IP 주소 있을 수 있으므로 적절한 IP 주소를 찾으려면 해당 콜렉션을 반복해야합니다.

편집 : 내가 유일한 변경이 설정을 변경하는 것입니다 :

if (ip.AddressFamily.ToString() == "InterNetwork")

이에:

if (ip.AddressFamily == AddressFamily.InterNetwork)

ToString비교 를 위해 열거 할 필요가 없습니다 .


3
가능하면 외부 IP 주소를 원합니다. NAT 뒤에 있으면 가능하지 않을 것이라고 생각합니다.
Nefzen

3
아니요, 컴퓨터는 NAT 주소 만 알고 있습니다.
앤드류 헤어

1
외부 주소를 얻으려면 외부 서버에 도달해야한다고 확신합니다.
Thiago Arrais

29
또한 breakIP가 수집을 통해 불필요하게 추가로 반복되는 것을 피하는 성명서를 제안 할 것 입니다 (이 경우 성능에 미치는 영향은 의심 스럽지만 일반적으로 좋은 코딩 습관을 강조하고 싶습니다)
Eric J.

7
머신에 여러 개의 'InterNetwork'포트가있는 경우 (내 경우에는 이더넷 카드와 가상 머신 포트) 실패 할 수 있습니다. 현재 코드는 목록의 마지막 IP를 제공합니다.
Christian Studer

168

공개 IP를 아는 유일한 방법은 다른 사람에게 당신에게 말하도록 요청하는 것입니다. 이 코드는 당신을 도울 수 있습니다 :

public string GetPublicIP()
{
    String direction = "";
    WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
    using (WebResponse response = request.GetResponse())
    using (StreamReader stream = new StreamReader(response.GetResponseStream()))
    {
        direction = stream.ReadToEnd();
    }

    //Search for the ip in the html
    int first = direction.IndexOf("Address: ") + 9;
    int last = direction.LastIndexOf("</body>");
    direction = direction.Substring(first, last - first);

    return direction;
}

20
코드 샘플이 Microsoft Academy에 설명 된 질문 13 스물 C # 질문에 언급되어 있음을 알고 있습니까? 발표자가 코드를 도용 한 것에 대해 사과합니다. 8시 30 분부터 참조 . :)
Erwin Rooijakkers

4
불행히도 링크가 죽었습니다.
Barry Guvenkaya

누구나보고 싶어하는 새로운 링크
Kimmax

1
링크 ipof.in/txt를 사용 하여 모든 HTML 파싱 코드없이 IP를 직접 얻을 수 있습니다
vivekv

82

하나의 솔루션으로 모든 것을 깨끗하게 청소하십시오 : D

//This returns the first IP4 address or null
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);

3
이 코드의 문제점 : * 컴퓨터에 단일 IP 주소 만 있다고 가정합니다. 많은 사람들이 여러 명 있습니다. * IPV4 주소 만 고려합니다. IPV6을 포함하도록 InterNetworkV6을 추가하십시오.
Robert Bratton

1
@RobertBratton, 재생 주셔서 감사합니다. 이 문제는 다중 IP 주소 또는 IPV6을 가정하지 않았으며이 코드를 약간 수정하면 특정 다른 문제를 처리 할 수 ​​있습니다.
Mohammed A. Fadil

50

나에게 일어난 DNS 서버에서 IP 주소를 얻는 것에 의존 할 수 없다면 다음과 같은 방법을 사용할 수 있습니다.

System.Net.NetworkInformation 네임 스페이스에는 정적 GetAllNetworkInterfaces 메서드 가있는 NetworkInterface 클래스 가 포함되어 있습니다 .

이 방법은 컴퓨터의 모든 "네트워크 인터페이스"를 반환하며 컴퓨터에 무선 어댑터 및 / 또는 이더넷 어댑터 하드웨어 만 설치되어 있어도 일반적으로 몇 가지가 있습니다. 이 네트워크 인터페이스는 모두 로컬 컴퓨터에 유효한 IP 주소를 가지고 있지만 아마도 하나만 원할 수도 있습니다.

하나의 IP 주소를 찾고 있다면 올바른 주소를 식별 할 수있을 때까지 목록을 필터링해야합니다. 아마도 몇 가지 실험을해야하지만 다음과 같은 접근 방식으로 성공했습니다.

  • 를 확인하여 비활성화 된 모든 네트워크 인터페이스를 필터링하십시오 OperationalStatus == OperationalStatus.Up. 예를 들어 네트워크 케이블이 연결되어 있지 않으면 실제 이더넷 어댑터가 제외됩니다.

각 NetworkInterface에 대해 GetIPProperties 메소드를 사용하여 IPInterfaceProperties 오브젝트를 얻을 수 있으며 IPInterfaceProperties 오브젝트 에서 UnicastIPAddressInformation 오브젝트 목록에 대한 UnicastAddresses 특성 에 액세스 할 수 있습니다 .

  • 다음을 확인하여 선호하지 않는 유니 캐스트 주소를 필터링하십시오. DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
  • 를 확인하여 "가상"주소를 필터링하십시오 AddressPreferredLifetime != UInt32.MaxValue.

이 시점에서 필자는이 필터들 모두와 일치하는 첫 번째 (있는 경우) 유니 캐스트 주소의 주소를 가져옵니다.

편집하다:

[중복 주소 감지 상태 및 선호 수명에 대해 위의 텍스트에 언급 된 조건을 포함하도록 2018 년 5 월 16 일에 개정 된 코드]

아래 샘플은 작동 상태, 주소 패밀리, 루프백 주소 (127.0.0.1) 제외, 중복 주소 감지 상태 및 선호 수명을 기준으로 필터링을 보여줍니다.

static IEnumerable<IPAddress> GetLocalIpAddresses()
{
    // Get the list of network interfaces for the local computer.
    var adapters = NetworkInterface.GetAllNetworkInterfaces();

    // Return the list of local IPv4 addresses excluding the local
    // host, disconnected, and virtual addresses.
    return (from adapter in adapters
            let properties = adapter.GetIPProperties()
            from address in properties.UnicastAddresses
            where adapter.OperationalStatus == OperationalStatus.Up &&
                  address.Address.AddressFamily == AddressFamily.InterNetwork &&
                  !address.Equals(IPAddress.Loopback) &&
                  address.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred &&
                  address.AddressPreferredLifetime != UInt32.MaxValue
            select address.Address);
}

2
이 특별한 경우에는 OP가 외부 IP 주소를보고 싶었으므로 DNS 솔루션을 사용하는 것이 좋습니다. 그러나 로컬 IP 주소를 반복하려면 이것이 권장되는 방법입니다.
Matt Davis

3
DNS가 IP 주소를 얻는 더 쉬운 방법이라고 동의했습니다. 내 대답 에서이 방법은 DNS가 신뢰할 수 없을 때 작동한다고 언급했습니다. 이더넷을 포트 한 이더넷 포트에서 다른 포트로 옮길 경우 DNS가 여전히 기존 IP 주소를보고하므로 내 목적에 거의 쓸모가 없도록 DNS가 엉망인 환경에서 이것을 사용했습니다.
윌리 박사의 견습생

모든 설명에 감사하지만 코드 샘플도 게시해야합니다.
Aidin

정말 고마워 최근 Windows 업데이트 인 UnicastAddresses에 유의하십시오. 첫 번째 가정은 더 이상 유지되지 않습니다. 이제 AddressPreferredLifetimeDuplicateAddressDetectionStation (위 텍스트 참조)을 사용하여 추가 필터링으로 각 어댑터의 모든 UnicastAddress 를 확인해야합니다.
user3085342

37
WebClient webClient = new WebClient();
string IP = webClient.DownloadString("http://myip.ozymo.com/");

ifconfig.me/ip가 더 이상 작동하지 않습니다. api.ipify.org 또는 Doug의 의견에있는 링크를 대신 사용해보십시오
Kenny83

16
using System.Net;

string host = Dns.GetHostName();
IPHostEntry ip = Dns.GetHostEntry(host);
Console.WriteLine(ip.AddressList[0].ToString());

내 컴퓨터에서 이것을 테스트하고 작동합니다.


3
그것은 U 로컬 IP를 얻을 것이다, 그리고 질문은 u를 찾아 인터넷에 .. 외부 IP ieIp에 관한 것입니다
Sangram Nandkhile

15

DNS를 사용하지 않으려면 다음을 수행하십시오.

List<IPAddress> ipList = new List<IPAddress>();
foreach (var netInterface in NetworkInterface.GetAllNetworkInterfaces())
{
    foreach (var address in netInterface.GetIPProperties().UnicastAddresses)
    {
        if (address.Address.AddressFamily == AddressFamily.InterNetwork)
        {
            Console.WriteLine("found IP " + address.Address.ToString());
            ipList.Add(address.Address);
        }
    }
}

9

IP를 사용하는 결과를 망칠 수있는 IP4를 사용하는 장치가 둘 이상있을 수 있으므로 항상 InterNetwork에 의존하지 마십시오. 지금, 당신이 원한다면 그냥 이것을 복사하고 그것을 검토하거나 당신이 적합한 것으로 업데이트하십시오.

먼저 라우터 (게이트웨이)의 주소를 얻습니다. 게이트웨이에 연결되어 모뎀 모뎀에 직접 연결되지 않았는지 여부를 다시 반환하면 게이트웨이 주소가 IPAddress로 지정됩니다. 그렇지 않으면 null 포인터 IPAddress 참조 .

그런 다음 컴퓨터의 IP 주소 목록을 가져와야합니다. 라우터 (모든 라우터)가 4 바이트 (...)를 사용하기 때문에 어려운 일이 아닙니다. 연결된 컴퓨터는 처음 3 바이트와 일치하는 IP4 주소를 가지므로 처음 3 개가 가장 중요합니다. 예 : 192.168.0.1은 관리자가 변경하지 않는 한 라우터 기본 IP의 표준입니다. '192.168.0'또는 그들이 무엇이든간에 우리는 일치해야합니다. 그리고 이것이 IsAddressOfGateway 함수에서 수행 한 모든 것입니다. 길이 일치 이유는 모든 주소 (컴퓨터 전용)의 길이가 4 바이트가 아니기 때문입니다. cmd에 netstat를 입력하면 이것이 사실임을 알 수 있습니다. 그래서 당신은 그것을 가지고 있습니다. 예, 실제로 원하는 것을 얻으려면 약간의 작업이 필요합니다. 제거 과정. 그리고 하나님을 위해서 ping 할 주소를 먼저 찾지 마십시오. 먼저 ping 할 주소를 보낸 다음 결과를 다시 보내야하므로 시간이 걸립니다. 아니요, 시스템 환경을 다루는 .Net 클래스를 직접 사용하면 컴퓨터와 관련이있을 때 원하는 답변을 얻을 수 있습니다.

이제 모뎀에 직접 연결된 경우 모뎀이 게이트웨이이기 때문에 프로세스는 거의 동일하지만 서브 마스크는 동일하지 않습니다. 모뎀을 통해 DNS 서버에서 직접 정보를 가져오고 라우터를 통해 라우터에 의해 마스크되지 않기 때문입니다. 모뎀에 할당 된 IP의 마지막 바이트가 1이기 때문에 여전히 동일한 코드를 사용할 수 있지만 인터넷은 귀하에게 있습니다. 따라서 변경되는 모뎀에서 보낸 IP가 111.111.111.1 '이면 111.111.111이됩니다. 바이트 값). 라우터 및 모뎀보다 인터넷 연결을 처리하는 장치가 더 많으므로 게이트웨이 정보를 찾아야합니다.

이제 라우터의 처음 2 바이트 192 및 168을 변경하지 않는 이유를 알 수 있습니다. 라우터는 인터넷에서만 사용되지 않고 라우터에서만 엄격하게 구별되거나 IP 프로토콜 및 이중 핑에 심각한 문제가 발생하여 컴퓨터가 충돌합니다. 할당 된 라우터 IP가 192.168.44.103이고 해당 IP가있는 사이트를 클릭 한 이미지. 세상에! 컴퓨터는 무엇을 핑해야할지 모릅니다. 저기 충돌. 이 문제를 피하기 위해 라우터에만 라우터가 할당되며 인터넷 사용이 아닙니다. 따라서 라우터의 처음 2 바이트는 그대로 두십시오.

static IPAddress FindLanAddress()
{
    IPAddress gateway = FindGetGatewayAddress();
    if (gateway == null)
        return null;

    IPAddress[] pIPAddress = Dns.GetHostAddresses(Dns.GetHostName());

    foreach (IPAddress address in pIPAddress)            {
        if (IsAddressOfGateway(address, gateway))
                return address;
    return null;
}
static bool IsAddressOfGateway(IPAddress address, IPAddress gateway)
{
    if (address != null && gateway != null)
        return IsAddressOfGateway(address.GetAddressBytes(),gateway.GetAddressBytes());
    return false;
}
static bool IsAddressOfGateway(byte[] address, byte[] gateway)
{
    if (address != null && gateway != null)
    {
        int gwLen = gateway.Length;
        if (gwLen > 0)
        {
            if (address.Length == gateway.Length)
            {
                --gwLen;
                int counter = 0;
                for (int i = 0; i < gwLen; i++)
                {
                    if (address[i] == gateway[i])
                        ++counter;
                }
                return (counter == gwLen);
            }
        }
    }
    return false;

}
static IPAddress FindGetGatewayAddress()
{
    IPGlobalProperties ipGlobProps = IPGlobalProperties.GetIPGlobalProperties();

    foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
    {
        IPInterfaceProperties ipInfProps = ni.GetIPProperties();
        foreach (GatewayIPAddressInformation gi in ipInfProps.GatewayAddresses)
            return gi.Address;
    }
    return null;
}

1
이는 의미가 없습니다. foreach (ipInfProps.GatewayAddresses의 GatewayIPAddressInformation gi) return gi.Address;
에드윈 에반스

3
"게이트웨이에 연결된 모든 컴퓨터가 처음 3 바이트와 일치하는 IP4 주소를 갖게된다"는 보장은 없습니다. 다양한 비트 조합을 포함 할 수있는 서브넷 마스크에 따라 다릅니다. 또한 여기에 설명 된대로 시작 바이트가 "192.168"일 필요는 없습니다 . 이 코드는 서브넷 마스크가 255.255.255.0인 경우에만 작동 하며 다소 복잡한 방식으로 IMO를 수행합니다.
Groo

8

방금 다른 유용한 답변이 많이 있지만 내 자신의 1 라이너를 추가 할 것이라고 생각했습니다.


string ipAddress = new WebClient().DownloadString("http://icanhazip.com");


4
메모리 누수 가능성이 있습니다. 웹 클라이언트가 올바르게 처리되지 않았습니다. 대신 다음을 사용하십시오. using (var client = new WebClient ()) {return client.DownloadString ( " icanhazip.com /"). Trim () ; }
FOO

4

현재 공개 IP 주소를 얻으려면 페이지로드 이벤트에 다음 줄을 사용하여 ASPX 페이지를 작성하기 만하면됩니다.

Response.Write(HttpContext.Current.Request.UserHostAddress.ToString());

4

인트라넷에서 실행중인 경우 로컬 컴퓨터 IP 주소를 얻을 수 있고 그렇지 않은 경우 다음을 사용하여 외부 IP 주소를 얻을 수 있습니다. 웹 :

//this will bring the IP for the current machine on browser
System.Web.HttpContext.Current.Request.UserHostAddress

데스크탑 :

//This one will bring all local IPs for the desired namespace
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());

3
namespace NKUtilities 
{
    using System;
    using System.Net;
    using System.Net.Sockets;

    public class DNSUtility
    {
        public static int Main(string [] args)
        {
            string strHostName = "";
            try {

                if(args.Length == 0)
                {
                    // Getting Ip address of local machine...
                    // First get the host name of local machine.
                    strHostName = Dns.GetHostName();
                    Console.WriteLine ("Local Machine's Host Name: " +  strHostName);
                }
                else
                {
                    // Otherwise, get the IP address of the host provided on the command line.
                    strHostName = args[0];
                }

                // Then using host name, get the IP address list..
                IPHostEntry ipEntry = Dns.GetHostEntry (strHostName);
                IPAddress [] addr = ipEntry.AddressList;

                for(int i = 0; i < addr.Length; i++)
                {
                    Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
                }
                return 0;

            } 
            catch(SocketException se) 
            {
                Console.WriteLine("{0} ({1})", se.Message, strHostName);
                return -1;
            } 
            catch(Exception ex) 
            {
                Console.WriteLine("Error: {0}.", ex.Message);
                return -1;
            }
        }
    }
}

여기에 자세한 내용은.

컴퓨터는 둘 이상의 IP를 가질 수 있다는 것을 기억해야합니다 (실제로는 항상 그러합니다).


2

이 시도:

 IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
 String MyIp = localIPs[0].ToString();

1
이것은 다수의 로컬 IP 주소를 리턴하는데, 그 중 하나는 IPv4 주소이지만 목록에서 올바른 주소를 찾기는 어렵습니다.
Contango

1

아마도 외부 IP로 이것을 사용하여 (웹 서버 컨텍스트에있는 경우) 고려할 수 있습니다

Request.ServerVariables["LOCAL_ADDR"];

당신과 내가 그것을 발견 나는 같은 질문을했다 유래 기사.

그것은 나를 위해 일했다.


1
namespace NKUtilities 
{
    using System;
    using System.Net;

    public class DNSUtility
    {
        public static int Main (string [] args)
        {

          String strHostName = new String ("");
          if (args.Length == 0)
          {
              // Getting Ip address of local machine...
              // First get the host name of local machine.
              strHostName = Dns.GetHostName ();
              Console.WriteLine ("Local Machine's Host Name: " +  strHostName);
          }
          else
          {
              strHostName = args[0];
          }

          // Then using host name, get the IP address list..
          IPHostEntry ipEntry = DNS.GetHostByName (strHostName);
          IPAddress [] addr = ipEntry.AddressList;

          for (int i = 0; i < addr.Length; i++)
          {
              Console.WriteLine ("IP Address {0}: {1} ", i, addr[i].ToString ());
          }
          return 0;
        }    
     }
}

1
using System;
using System.Net;

namespace IPADDRESS
{
    class Program
    {
        static void Main(string[] args)
        {
            String strHostName = string.Empty;
            if (args.Length == 0)
            {                
                /* First get the host name of local machine.*/
                strHostName = Dns.GetHostName();
                Console.WriteLine("Local Machine's Host Name: " + strHostName);
            }
            else
            {
                strHostName = args[0];
            }
            /* Then using host name, get the IP address list..*/
            IPHostEntry ipEntry = Dns.GetHostByName(strHostName);
            IPAddress[] addr = ipEntry.AddressList;
            for (int i = 0; i < addr.Length; i++)
            {
                Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
            }
            Console.ReadLine();
        }
    }
}

1
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);

첫 번째 내부 IPV4 주소를 반환하는 간단한 단일 코드 줄이거 나없는 경우 null입니다. 위의 설명으로 추가되었지만 누군가에게 유용 할 수 있습니다 (위의 일부 솔루션은 추가 필터링이 필요한 여러 주소를 반환 함).

null 대신 루프백을 반환하는 것도 쉽습니다.

return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork) ?? new IPAddress( new byte[] {127, 0, 0, 1} );

1
어때요 IPAddress.Loopback? :)
CodeTherapist

1

IP 주소 목록을 찾으려면이 솔루션을 사용했습니다

public static IEnumerable<string> GetAddresses()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    return (from ip in host.AddressList where ip.AddressFamily == AddressFamily.lo select ip.ToString()).ToList();
}

하지만 개인적으로 로컬 유효한 IP 주소 를 얻으려면 아래 솔루션을 좋아합니다.

public static IPAddress GetIPAddress(string hostName)
{
    Ping ping = new Ping();
    var replay = ping.Send(hostName);

    if (replay.Status == IPStatus.Success)
    {
        return replay.Address;
    }
    return null;
 }

public static void Main()
{
    Console.WriteLine("Local IP Address: " + GetIPAddress(Dns.GetHostName()));
    Console.WriteLine("Google IP:" + GetIPAddress("google.com");
    Console.ReadLine();
}

1

LINQ 솔루션 :

Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork).Select(ip => ip.ToString()).FirstOrDefault() ?? ""

1

여기에 내가 해결 한 방법이 있습니다. 물리적 인터페이스가 여러 개인 경우 원하는 정확한 eth를 선택하지 못할 수 있습니다.

private string FetchIP()
{
    //Get all IP registered
    List<string> IPList = new List<string>();
    IPHostEntry host;
    host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            IPList.Add(ip.ToString());
        }
    }

    //Find the first IP which is not only local
    foreach (string a in IPList)
    {
        Ping p = new Ping();
        string[] b = a.Split('.');
        string ip2 = b[0] + "." + b[1] + "." + b[2] + ".1";
        PingReply t = p.Send(ip2);
        p.Dispose();
        if (t.Status == IPStatus.Success && ip2 != a)
        {
            return a;
        }
    }
    return null;
}

1

질문은 ASP.NET MVC를 말하지 않지만 어쨌든 여기에 남겨두고 있습니다.

Request.UserHostAddress

1

LINQ를 사용하여 모든 IP 주소를 문자열로 가져옵니다.

using System.Linq;
using System.Net.NetworkInformation;
using System.Net.Sockets;
...
string[] allIpAddresses = NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(c=>c.GetIPProperties().UnicastAddresses
        .Where(d=>d.Address.AddressFamily == AddressFamily.InterNetwork)
        .Select(d=>d.Address.ToString())
    ).ToArray();

개인 정보를 필터링하려면 ...

먼저 확장 방법을 정의하십시오 IsPrivate().

public static class IPAddressExtensions
{
    // Collection of private CIDRs (IpAddress/Mask) 
    private static Tuple<int, int>[] _privateCidrs = new []{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"}
        .Select(c=>Tuple.Create(BitConverter.ToInt32(IPAddress
                                    .Parse(c.Split('/')[0]).GetAddressBytes(), 0)
                              , IPAddress.HostToNetworkOrder(-1 << (32-int.Parse(c.Split('/')[1])))))
        .ToArray();
    public static bool IsPrivate(this IPAddress ipAddress)
    {
        int ip = BitConverter.ToInt32(ipAddress.GetAddressBytes(), 0);
        return _privateCidrs.Any(cidr=>(ip & cidr.Item2)==(cidr.Item1 & cidr.Item2));           
    }
}

... 그런 다음 개인 IP를 필터링하는 데 사용하십시오.

string[] publicIpAddresses = NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(c=>c.GetIPProperties().UnicastAddresses
        .Where(d=>d.Address.AddressFamily == AddressFamily.InterNetwork
            && !d.Address.IsPrivate() // Filter out private ones
        )
        .Select(d=>d.Address.ToString())
    ).ToArray();

1

그것은 나를 위해 작동하며 DNS 서버를 쿼리하는 것보다 대부분의 경우 더 빠를 것입니다. 윌리 박사의 견습생에게 감사합니다 ( here ).

// ************************************************************************
/// <summary>
/// Will search for the an active NetworkInterafce that has a Gateway, otherwise
/// it will fallback to try from the DNS which is not safe.
/// </summary>
/// <returns></returns>
public static NetworkInterface GetMainNetworkInterface()
{
    List<NetworkInterface> candidates = new List<NetworkInterface>();

    if (NetworkInterface.GetIsNetworkAvailable())
    {
        NetworkInterface[] NetworkInterfaces =
            NetworkInterface.GetAllNetworkInterfaces();

        foreach (
            NetworkInterface ni in NetworkInterfaces)
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
                candidates.Add(ni);
        }
    }

    if (candidates.Count == 1)
    {
        return candidates[0];
    }

    // Accoring to our tech, the main NetworkInterface should have a Gateway 
    // and it should be the ony one with a gateway.
    if (candidates.Count > 1)
    {
        for (int n = candidates.Count - 1; n >= 0; n--)
        {
            if (candidates[n].GetIPProperties().GatewayAddresses.Count == 0)
            {
                candidates.RemoveAt(n);
            }
        }

        if (candidates.Count == 1)
        {
            return candidates[0];
        }
    }

    // Fallback to try by getting my ipAdress from the dns
    IPAddress myMainIpAdress = null;
    IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork) // Get the first IpV4
        {
            myMainIpAdress = ip;
            break;
        }
    }

    if (myMainIpAdress != null)
    {
        NetworkInterface[] NetworkInterfaces =
            NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface ni in NetworkInterfaces)
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
            {
                IPInterfaceProperties props = ni.GetIPProperties();
                foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                {
                    if (ai.Address.Equals(myMainIpAdress))
                    {
                        return ni;
                    }
                }
            }
        }
    }

    return null;
}

// ******************************************************************
/// <summary>
/// AddressFamily.InterNetwork = IPv4
/// Thanks to Dr. Wilys Apprentice at
/// http://stackoverflow.com/questions/1069103/how-to-get-the-ip-address-of-the-server-on-which-my-c-sharp-application-is-runni
/// using System.Net.NetworkInformation;
/// </summary>
/// <param name="mac"></param>
/// <param name="addressFamily">AddressFamily.InterNetwork = IPv4,  AddressFamily.InterNetworkV6 = IPv6</param>
/// <returns></returns>
public static IPAddress GetIpFromMac(PhysicalAddress mac, AddressFamily addressFamily = AddressFamily.InterNetwork)
{
    NetworkInterface[] NetworkInterfaces =
        NetworkInterface.GetAllNetworkInterfaces();

    foreach (NetworkInterface ni in NetworkInterfaces)
    {
        if (ni.GetPhysicalAddress().Equals(mac))
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
            {
                IPInterfaceProperties props = ni.GetIPProperties();
                foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                {
                    if (ai.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred)
                    {
                        if (ai.Address.AddressFamily == addressFamily)
                        {
                            return ai.Address;
                        }
                    }
                }
            }
        }
    }

    return null;
}

// ******************************************************************
/// <summary>
/// Return the best guess of main ipAdress. To get it in the form aaa.bbb.ccc.ddd just call 
/// '?.ToString() ?? ""' on the result.
/// </summary>
/// <returns></returns>
public static IPAddress GetMyInternetIpAddress()
{
    NetworkInterface ni = GetMainNetworkInterface();
    IPAddress ipAddress = GetIpFromMac(ni.GetPhysicalAddress());
    if (ipAddress == null) // could it be possible ?
    {
        ipAddress = GetIpFromMac(ni.GetPhysicalAddress(), AddressFamily.InterNetworkV6);
    }

    return ipAddress;
}

// ******************************************************************

참조처럼 이것은 내가 정의한 전체 클래스 코드입니다.

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Threading.Tasks;

namespace TcpMonitor
{
    /*
        Usage:
                var cons = TcpHelper.GetAllTCPConnections();
                foreach (TcpHelper.MIB_TCPROW_OWNER_PID c in cons) ...
    */

    public class NetHelper
    {
        [DllImport("iphlpapi.dll", SetLastError = true)]
        static extern uint GetExtendedUdpTable(IntPtr pUdpTable, ref int dwOutBufLen, bool sort, int ipVersion, UDP_TABLE_CLASS tblClass, uint reserved = 0);

        public enum UDP_TABLE_CLASS
        {
            UDP_TABLE_BASIC,
            UDP_TABLE_OWNER_PID,
            UDP_TABLE_OWNER_MODULE
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDPTABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_UDPROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDPROW_OWNER_PID
        {
            public uint localAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDP6TABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_UDP6ROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDP6ROW_OWNER_PID
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] localAddr;
            public uint localScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint owningPid;
            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr, localScopeId); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }
        }

        public static List<MIB_UDPROW_OWNER_PID> GetAllUDPConnections()
        {
            return GetUDPConnections<MIB_UDPROW_OWNER_PID, MIB_UDPTABLE_OWNER_PID> (AF_INET);
        }

        public static List<MIB_UDP6ROW_OWNER_PID> GetAllUDPv6Connections()
        {
            return GetUDPConnections<MIB_UDP6ROW_OWNER_PID, MIB_UDP6TABLE_OWNER_PID>(AF_INET6);
        }

        private static List<IPR> GetUDPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type
        {
            List<IPR> result = null;

            IPR[] tableRows = null;
            int buffSize = 0;

            var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries");

            // how much memory do we need?
            uint ret = GetExtendedUdpTable(IntPtr.Zero, ref buffSize, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID);
            IntPtr udpTablePtr = Marshal.AllocHGlobal(buffSize);

            try
            {
                ret = GetExtendedUdpTable(udpTablePtr, ref buffSize, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID);
                if (ret != 0)
                    return new List<IPR>();

                // get the number of entries in the table
                IPT table = (IPT)Marshal.PtrToStructure(udpTablePtr, typeof(IPT));
                int rowStructSize = Marshal.SizeOf(typeof(IPR));
                uint numEntries = (uint)dwNumEntriesField.GetValue(table);

                // buffer we will be returning
                tableRows = new IPR[numEntries];

                IntPtr rowPtr = (IntPtr)((long)udpTablePtr + 4);
                for (int i = 0; i < numEntries; i++)
                {
                    IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR));
                    tableRows[i] = tcpRow;
                    rowPtr = (IntPtr)((long)rowPtr + rowStructSize);   // next entry
                }
            }
            finally
            {
                result = tableRows?.ToList() ?? new List<IPR>();

                // Free the Memory
                Marshal.FreeHGlobal(udpTablePtr);
            }

            return result;
        }

        [DllImport("iphlpapi.dll", SetLastError = true)]
        static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwOutBufLen, bool sort, int ipVersion, TCP_TABLE_CLASS tblClass, uint reserved = 0);



        public enum MIB_TCP_STATE
        {
            MIB_TCP_STATE_CLOSED = 1,
            MIB_TCP_STATE_LISTEN = 2,
            MIB_TCP_STATE_SYN_SENT = 3,
            MIB_TCP_STATE_SYN_RCVD = 4,
            MIB_TCP_STATE_ESTAB = 5,
            MIB_TCP_STATE_FIN_WAIT1 = 6,
            MIB_TCP_STATE_FIN_WAIT2 = 7,
            MIB_TCP_STATE_CLOSE_WAIT = 8,
            MIB_TCP_STATE_CLOSING = 9,
            MIB_TCP_STATE_LAST_ACK = 10,
            MIB_TCP_STATE_TIME_WAIT = 11,
            MIB_TCP_STATE_DELETE_TCB = 12
        }

        public enum TCP_TABLE_CLASS
        {
            TCP_TABLE_BASIC_LISTENER,
            TCP_TABLE_BASIC_CONNECTIONS,
            TCP_TABLE_BASIC_ALL,
            TCP_TABLE_OWNER_PID_LISTENER,
            TCP_TABLE_OWNER_PID_CONNECTIONS,
            TCP_TABLE_OWNER_PID_ALL,
            TCP_TABLE_OWNER_MODULE_LISTENER,
            TCP_TABLE_OWNER_MODULE_CONNECTIONS,
            TCP_TABLE_OWNER_MODULE_ALL
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCPTABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_TCPROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCP6TABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_TCP6ROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCPROW_OWNER_PID
        {
            public uint state;
            public uint localAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint remoteAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] remotePort;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr); }
            }

            public ushort LocalPort
            {
                get
                {
                    return BitConverter.ToUInt16(new byte[2] { localPort[1], localPort[0] }, 0);
                }
            }

            public IPAddress RemoteAddress
            {
                get { return new IPAddress(remoteAddr); }
            }

            public ushort RemotePort
            {
                get
                {
                    return BitConverter.ToUInt16(new byte[2] { remotePort[1], remotePort[0] }, 0);
                }
            }

            public MIB_TCP_STATE State
            {
                get { return (MIB_TCP_STATE)state; }
            }
        }


        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCP6ROW_OWNER_PID
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] localAddr;
            public uint localScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] remoteAddr;
            public uint remoteScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] remotePort;
            public uint state;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public long LocalScopeId
            {
                get { return localScopeId; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr, LocalScopeId); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }

            public long RemoteScopeId
            {
                get { return remoteScopeId; }
            }

            public IPAddress RemoteAddress
            {
                get { return new IPAddress(remoteAddr, RemoteScopeId); }
            }

            public ushort RemotePort
            {
                get { return BitConverter.ToUInt16(remotePort.Take(2).Reverse().ToArray(), 0); }
            }

            public MIB_TCP_STATE State
            {
                get { return (MIB_TCP_STATE)state; }
            }
        }


        public const int AF_INET = 2;    // IP_v4 = System.Net.Sockets.AddressFamily.InterNetwork
        public const int AF_INET6 = 23;  // IP_v6 = System.Net.Sockets.AddressFamily.InterNetworkV6

        public static Task<List<MIB_TCPROW_OWNER_PID>> GetAllTCPConnectionsAsync()
        {
            return Task.Run(() => GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET));
        }

        public static List<MIB_TCPROW_OWNER_PID> GetAllTCPConnections()
        {
            return GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET);
        }

        public static Task<List<MIB_TCP6ROW_OWNER_PID>> GetAllTCPv6ConnectionsAsync()
        {
            return Task.Run(()=>GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6));
        }

        public static List<MIB_TCP6ROW_OWNER_PID> GetAllTCPv6Connections()
        {
            return GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6);
        }

        private static List<IPR> GetTCPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type
        {
            List<IPR> result = null;

            IPR[] tableRows = null;
            int buffSize = 0;

            var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries");

            // how much memory do we need?
            uint ret = GetExtendedTcpTable(IntPtr.Zero, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);
            IntPtr tcpTablePtr = Marshal.AllocHGlobal(buffSize);

            try
            {
                ret = GetExtendedTcpTable(tcpTablePtr, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);
                if (ret != 0)
                    return new List<IPR>();

                // get the number of entries in the table
                IPT table = (IPT)Marshal.PtrToStructure(tcpTablePtr, typeof(IPT));
                int rowStructSize = Marshal.SizeOf(typeof(IPR));
                uint numEntries = (uint)dwNumEntriesField.GetValue(table);

                // buffer we will be returning
                tableRows = new IPR[numEntries];

                IntPtr rowPtr = (IntPtr)((long)tcpTablePtr + 4);
                for (int i = 0; i < numEntries; i++)
                {
                    IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR));
                    tableRows[i] = tcpRow;
                    rowPtr = (IntPtr)((long)rowPtr + rowStructSize);   // next entry
                }
            }
            finally
            {
                result = tableRows?.ToList() ?? new List<IPR>();

                // Free the Memory
                Marshal.FreeHGlobal(tcpTablePtr);
            }

            return result;
        }

        public static string GetTcpStateName(MIB_TCP_STATE state)
        {
            switch (state)
            {
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSED:
                    return "Closed";
                case MIB_TCP_STATE.MIB_TCP_STATE_LISTEN:
                    return "Listen";
                case MIB_TCP_STATE.MIB_TCP_STATE_SYN_SENT:
                    return "SynSent";
                case MIB_TCP_STATE.MIB_TCP_STATE_SYN_RCVD:
                    return "SynReceived";
                case MIB_TCP_STATE.MIB_TCP_STATE_ESTAB:
                    return "Established";
                case MIB_TCP_STATE.MIB_TCP_STATE_FIN_WAIT1:
                    return "FinWait 1";
                case MIB_TCP_STATE.MIB_TCP_STATE_FIN_WAIT2:
                    return "FinWait 2";
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSE_WAIT:
                    return "CloseWait";
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSING:
                    return "Closing";
                case MIB_TCP_STATE.MIB_TCP_STATE_LAST_ACK:
                    return "LastAck";
                case MIB_TCP_STATE.MIB_TCP_STATE_TIME_WAIT:
                    return "TimeWait";
                case MIB_TCP_STATE.MIB_TCP_STATE_DELETE_TCB:
                    return "DeleteTCB";
                default:
                    return ((int)state).ToString();
            }
        }

        private static readonly ConcurrentDictionary<string, string> DicOfIpToHostName = new ConcurrentDictionary<string, string>();

        public const string UnknownHostName = "Unknown";

        // ******************************************************************
        public static string GetHostName(IPAddress ipAddress)
        {
            return GetHostName(ipAddress.ToString());
        }

        // ******************************************************************
        public static string GetHostName(string ipAddress)
        {
            string hostName = null;

            if (!DicOfIpToHostName.TryGetValue(ipAddress, out hostName))
            {
                try
                {
                    if (ipAddress == "0.0.0.0" || ipAddress == "::")
                    {
                        hostName = ipAddress;
                    }
                    else
                    {
                        hostName = Dns.GetHostEntry(ipAddress).HostName;
                    }
                }
                catch (Exception ex)
                {
                    Debug.Print(ex.ToString());
                    hostName = UnknownHostName;
                }

                DicOfIpToHostName[ipAddress] = hostName;
            }

            return hostName;
        }

        // ************************************************************************
        /// <summary>
        /// Will search for the an active NetworkInterafce that has a Gateway, otherwise
        /// it will fallback to try from the DNS which is not safe.
        /// </summary>
        /// <returns></returns>
        public static NetworkInterface GetMainNetworkInterface()
        {
            List<NetworkInterface> candidates = new List<NetworkInterface>();

            if (NetworkInterface.GetIsNetworkAvailable())
            {
                NetworkInterface[] NetworkInterfaces =
                    NetworkInterface.GetAllNetworkInterfaces();

                foreach (
                    NetworkInterface ni in NetworkInterfaces)
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                        candidates.Add(ni);
                }
            }

            if (candidates.Count == 1)
            {
                return candidates[0];
            }

            // Accoring to our tech, the main NetworkInterface should have a Gateway 
            // and it should be the ony one with a gateway.
            if (candidates.Count > 1)
            {
                for (int n = candidates.Count - 1; n >= 0; n--)
                {
                    if (candidates[n].GetIPProperties().GatewayAddresses.Count == 0)
                    {
                        candidates.RemoveAt(n);
                    }
                }

                if (candidates.Count == 1)
                {
                    return candidates[0];
                }
            }

            // Fallback to try by getting my ipAdress from the dns
            IPAddress myMainIpAdress = null;
            IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork) // Get the first IpV4
                {
                    myMainIpAdress = ip;
                    break;
                }
            }

            if (myMainIpAdress != null)
            {
                NetworkInterface[] NetworkInterfaces =
                    NetworkInterface.GetAllNetworkInterfaces();

                foreach (NetworkInterface ni in NetworkInterfaces)
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                    {
                        IPInterfaceProperties props = ni.GetIPProperties();
                        foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                        {
                            if (ai.Address.Equals(myMainIpAdress))
                            {
                                return ni;
                            }
                        }
                    }
                }
            }

            return null;
        }

        // ******************************************************************
        /// <summary>
        /// AddressFamily.InterNetwork = IPv4
        /// Thanks to Dr. Wilys Apprentice at
        /// http://stackoverflow.com/questions/1069103/how-to-get-the-ip-address-of-the-server-on-which-my-c-sharp-application-is-runni
        /// using System.Net.NetworkInformation;
        /// </summary>
        /// <param name="mac"></param>
        /// <param name="addressFamily">AddressFamily.InterNetwork = IPv4,  AddressFamily.InterNetworkV6 = IPv6</param>
        /// <returns></returns>
        public static IPAddress GetIpFromMac(PhysicalAddress mac, AddressFamily addressFamily = AddressFamily.InterNetwork)
        {
            NetworkInterface[] NetworkInterfaces =
                NetworkInterface.GetAllNetworkInterfaces();

            foreach (NetworkInterface ni in NetworkInterfaces)
            {
                if (ni.GetPhysicalAddress().Equals(mac))
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                    {
                        IPInterfaceProperties props = ni.GetIPProperties();
                        foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                        {
                            if (ai.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred)
                            {
                                if (ai.Address.AddressFamily == addressFamily)
                                {
                                    return ai.Address;
                                }
                            }
                        }
                    }
                }
            }

            return null;
        }

        // ******************************************************************
        /// <summary>
        /// Return the best guess of main ipAdress. To get it in the form aaa.bbb.ccc.ddd just call 
        /// '?.ToString() ?? ""' on the result.
        /// </summary>
        /// <returns></returns>
        public static IPAddress GetMyInternetIpAddress()
        {
            NetworkInterface ni = GetMainNetworkInterface();
            IPAddress ipAddress = GetIpFromMac(ni.GetPhysicalAddress());
            if (ipAddress == null) // could it be possible ?
            {
                ipAddress = GetIpFromMac(ni.GetPhysicalAddress(), AddressFamily.InterNetworkV6);
            }

            return ipAddress;
        }

        // ******************************************************************
        public static bool IsBroadcastAddress(IPAddress ipAddress)
        {
            if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
            {
                return ipAddress.GetAddressBytes()[3] == 255;
            }

            if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                return false; // NO broadcast in IPv6
            }

            return false;
        }

        // ******************************************************************
        public static bool IsMulticastAddress(IPAddress ipAddress)
        {
            if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
            {
                // Source: https://technet.microsoft.com/en-us/library/cc772041(v=ws.10).aspx
                return ipAddress.GetAddressBytes()[0] >= 224 && ipAddress.GetAddressBytes()[0] <= 239;
            }

            if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                return ipAddress.IsIPv6Multicast;
            }

            return false;
        }

        // ******************************************************************

    }
}

1

공개 IP 주소를 얻는 또 다른 방법은 OpenDNS resolve1.opendns.com서버를 myip.opendns.com요청으로 사용하는 것입니다.

명령 행에서 이것은 다음과 같습니다.

  nslookup myip.opendns.com resolver1.opendns.com

또는 DNSClient nuget을 사용하는 C #에서 :

  var lookup = new LookupClient(new IPAddress(new byte[] { 208, 67, 222, 222 }));
  var result = lookup.Query("myip.opendns.com", QueryType.ANY);

이것은 http 끝점에 도달하고 응답을 구문 분석하는 것보다 약간 더 깨끗합니다.


0

그리고 이것은 VB.NET에서 csv 형식의 모든 로컬 IP를 얻는 것입니다.

Imports System.Net
Imports System.Net.Sockets

Function GetIPAddress() As String
    Dim ipList As List(Of String) = New List(Of String)
    Dim host As IPHostEntry
    Dim localIP As String = "?"
    host = Dns.GetHostEntry(Dns.GetHostName())
    For Each ip As IPAddress In host.AddressList
        If ip.AddressFamily = AddressFamily.InterNetwork Then
            localIP = ip.ToString()
            ipList.Add(localIP)
        End If
    Next
    Dim ret As String = String.Join(",", ipList.ToArray)
    Return ret
End Function

0

가장 빠른 방법으로 원격 IP 주소를 얻으려면. 다운로더를 사용하거나 컴퓨터에서 서버를 작성해야합니다.

이 간단한 코드를 사용하는 단점은 (권장) 초기화 할 때 웹 클라이언트가 프록시 설정을 확인하는 데 항상 3-5 초가 걸리기 때문에 원격 IP 주소를 얻는 데 3-5 초가 걸린다는 것입니다.

 public static string GetIP()
 {
            string externalIP = "";
            externalIP = new WebClient().DownloadString("http://checkip.dyndns.org/");
            externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                                           .Matches(externalIP)[0].ToString();
            return externalIP;
 }

여기에 내가 어떻게 고쳤는지 .. (처음으로 3-5 초가 걸린다) 그러나 그 후에는 연결에 따라 항상 0-2 초 안에 원격 IP 주소를 얻습니다.

public static WebClient webclient = new WebClient();
public static string GetIP()
{
    string externalIP = "";
    externalIP = webclient.DownloadString("http://checkip.dyndns.org/");
    externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                                   .Matches(externalIP)[0].ToString();
    return externalIP;
}

왜 공감해야합니까? 웹 클라이언트를 초기화 할 때마다 큰 오버 헤드 지연이 발생하지 않습니다.
SSpoke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.