로컬 IP 주소 얻기


301

인터넷에는 IP 주소를 얻는 방법을 보여주는 여러 곳이 있습니다. 그리고 많은 사람들이이 예제처럼 보입니다 :

String strHostName = string.Empty;
// 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);
// 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());
}
Console.ReadLine();

이 예에서는 여러 개의 IP 주소를 얻지 만 라우터가 프로그램을 실행하는 컴퓨터에 할당하는 IP 주소를 얻는 데 관심이 있습니다. 예.

네트워크에 연결되어 있지 않고 라우터가없는 모뎀을 통해 인터넷에 직접 연결되어 있으면 오류가 발생합니다. 컴퓨터가 C #으로 네트워크에 연결되어 있고 LAN IP 주소를 가져 오는지 어떻게 알 수 있습니까?


If I am not connected to a network and I am connected to the internet 이 진술은 모순되는 것 같습니다. 컴퓨터가 개인 LAN 또는 인터넷에 연결되어 있는지 확인하려고합니까?
Andy

4
경고와 마찬가지로 : 컴퓨터에는 LAN 및 WiFi와 같은 둘 이상의 IP 인터페이스가있을 수 있습니다. 특정 하드웨어 (예 : LAN)에 서비스를 바인딩하는 경우 LAN의 IP가 필요합니다. 다음 예의 대부분은 "처음"또는 "마지막"IP 주소를 반환합니다. IP 주소가 두 개 이상인 경우 OS가 IP 주소를 반환하는 임의의 순서에 따라 프로그램이 50 %의 시간 동안 작동 할 수 있습니다.
Mark Lakata

@ MarkLakata 나는 같은 문제를 생각했다. 아래 답변의 기능이 처리합니다. IP 주소를 원하는 네트워크 인터페이스 유형을 지정할 수 있습니다.
compman2408

3
FTR 만 있다면 여기 Unity3D 용 Google이 있다면 API의 Network.player.ipAddress입니다.
Fattie

@MarkLakata 는 브라우저가 사용 가능한 IP를 사용할 수 있으므로 "첫 번째"또는 "마지막"IP "올바른"IP입니다. 머신과 관련된 모든 IP 를 반환하는 것이 좋습니다 .
UncaAlby 2013

답변:


457

로컬 IP 주소를 얻으려면 :

public static string GetLocalIPAddress()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (var ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            return ip.ToString();
        }
    }
    throw new Exception("No network adapters with an IPv4 address in the system!");
}

연결되어 있는지 확인하려면 :

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();


29
vm virtual box, genymotion 등을 사용하면 작동하지 않습니다.
PauLEffect

5
PaulEffect에 동의하십시오. 이 방법은 여러 네트워크 카드에 좋지 않을뿐만 아니라 IP v6과 IP v4 주소를 구분하지도 않습니다.
Max

16
@ 존 AddressFamily.InterNetwork는 IP v4를하고 AddressFamily.InterNetworkV6는 IP 버전 6 인
레오나르도 자비에르

나는 Geraldo H Answer를 사용하고 있지만, 누군가 이것을 사용하고 있다면, 1로 끝나는 모든 IP를 제거하고 싶을 수도있다. 그래서 루프백과 virtualbox / vmware 기본 ip를 제거 할 것이다
Leonardo Xavier

6
VMWare 또는 기타 가상화 소프트웨어를 사용하고있는 것 같습니다. OP는 그것을 요구하지 않았기 때문에 그로 인한 투표 거부는 다소 거칠다고 생각합니다. VMWare 또는 여러 NIC가있는 경우 다른 답변 중 일부가 이미 이에 대한 힌트를 제공합니다.
Mr.

218

로컬 컴퓨터에서 사용 가능한 다중 IP 주소가있을 때 더 정확한 방법이 있습니다. ConnectUDP 소켓에서 로컬 엔드 포인트를 읽습니다.

string localIP;
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
    socket.Connect("8.8.8.8", 65530);
    IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
    localIP = endPoint.Address.ToString();
}

ConnectUDP 소켓의 경우 다음과 같은 효과가 있습니다. Send/ 의 대상을 설정하고 Recv다른 주소에서 모든 패킷을 버리고 사용하는 소켓을 "연결된"상태로 전송하고 해당 필드를 설정합니다. 여기에는 시스템의 라우팅 테이블에 따라 대상에 대한 경로가 있는지 확인하고 이에 따라 로컬 엔드 포인트를 설정하는 것이 포함됩니다. 마지막 부분은 공식적으로 문서화되지 않은 것으로 보이지만 버전과 배포판에서 Windows 와 Linux 모두에서 안정적으로 작동하는 Berkeley 소켓 API (UDP "연결된"상태의 부작용) 의 핵심적인 특성처럼 보입니다 .

따라서이 방법은 지정된 원격 호스트에 연결하는 데 사용되는 로컬 주소를 제공합니다. 실제 연결이 설정되지 않았으므로 지정된 원격 IP에 도달 할 수 없습니다.


4
이것은 내 요구에 가장 적합한 솔루션입니다. 제 상황에는 많은 네트워크 카드와 몇 개의 무선 연결이 있습니다. 활성화 된 연결에 따라 선호하는 IP 주소를 가져와야했습니다.
David

10
네트워크 연결이 없으면 IP 주소가 없습니다. 따라서 이러한 상황을 처리하기 위해 try..catch를 추가하고 SocketException이 발생하면 "127.0.0.1"과 같은 것을 반환하는 것이 좋지만 코드는 여전히 유효합니다.
Russ

2
@PatrickSteele, yep, 특정 대상에 대한 기본 아웃 바운드 IP 주소를 반환합니다. 당신이 당신의 LAN IP 주소를 얻으려면, 목표는 당신의 LAN에서 일부 IP로 표시하려고합니다
Next Door의 Mr.Wang

2
이 방법은 닷넷 코어가있는 Mac에서 작동하지만 현재 허용되는 답변은 그렇지 않습니다.
Pellet

9
이 솔루션은 허용 된 답변보다 약 4 배 더 빠릅니다 (Mrchief). 이것은 진정한 답변이어야합니다
Kamarey

115

Linq (예 : .Net 3.0+)를 활용하기 위해 Mrcheif의 코드를 리팩토링했습니다. .

private IPAddress LocalIPAddress()
{
    if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
    {
        return null;
    }

    IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());

    return host
        .AddressList
        .FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
}

:)


이 솔루션이 실제로 작동하고 올바른 주소를 제공하는 "Inter Network"와 같은 몇 가지 IP 주소가 있습니다. Mr. Chief의 다른 하나는 저에게 마지막 것입니다. 실제로 이것은 올바른 것이되어야합니다;)
Keenora Fluffball

26
@KeenoraFluffball-이것은 당신에게 첫 번째 것을 제공하지만, 이것은 당신에게 마지막 것을 제공합니다 (또는 그 반대로도 목록 구성 방법에 달려 있습니다). 어느 쪽이든, 어느 쪽도 옳지 않습니다. 둘 이상의 IP 주소가 제공되면 사용중인 네트워크를 알아야합니다. 첫 번째 또는 마지막으로 추측하는 것이 올바른 해결책이 아닙니다.
gbjbaanb

또한 AddressFamily.InterNetworkV6 포함 할 수 있습니다
joelsand

네트워크를 사용할 수없는 경우 null을 반환하면 독립형 PC도 처리해야하는 경우 유용하지 않습니다. "return IPAddress.Loopback;"으로 바 꾸었습니다. 특수 IP 번호 127.0.0.1에 해당합니다.
Christian

109

나는 이것이 죽은 말을 걷어차는 것을 알고 있지만 어쩌면 이것은 누군가를 도울 수 있습니다. 로컬 IP 주소를 찾는 방법을 찾기 위해 모든 곳을 살펴 봤지만 어디에서나 사용한다고 말합니다.

Dns.GetHostEntry(Dns.GetHostName());

컴퓨터에 할당 된 모든 주소 만 가져 오기 때문에이 점이 마음에 들지 않습니다. 여러 네트워크 인터페이스가있는 경우 (대부분의 모든 컴퓨터에서 현재 수행하는 작업) 어떤 주소가 어떤 네트워크 인터페이스와 연결되는지 알 수 없습니다. 많은 연구를 한 후 NetworkInterface 클래스를 사용하고 정보를 빼내는 함수를 만들었습니다. 이런 식으로 인터페이스의 유형 (이더넷, 무선, 루프백, 터널 등), 활성 여부에 관계없이 훨씬 더 많은 것을 알 수 있습니다.

public string GetLocalIPv4(NetworkInterfaceType _type)
{
    string output = "";
    foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
        {
            foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
            {
                if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
                {
                    output = ip.Address.ToString();
                }
            }
        }
    }
    return output;
}

이더넷 네트워크 인터페이스 호출의 IPv4 주소를 가져 오려면 다음을 수행하십시오.

GetLocalIPv4(NetworkInterfaceType.Ethernet);

또는 무선 인터페이스 :

GetLocalIPv4(NetworkInterfaceType.Wireless80211);

무선 인터페이스의 IPv4 주소를 가져 오려고하지만 컴퓨터에 무선 카드가 설치되어 있지 않으면 빈 문자열 만 반환합니다. 이더넷 인터페이스도 마찬가지입니다.

이것이 누군가를 돕기를 바랍니다! :-)

편집하다:

이 함수는 IP 주소를 사용하는 것보다 훨씬 더 나은 방법으로 IP 주소를 추출하는 경우에도 @NasBanov 덕분 Dns.GetHostEntry(Dns.GetHostName())에 단일 인터페이스에서 동일한 유형의 여러 인터페이스 또는 여러 IP 주소를 지원하는 데별로 좋지 않습니다. . 여러 주소가 할당 된 경우 단일 IP 주소 만 반환합니다. 할당 된 주소를 모두 반환하려면 원래 함수를 조작하여 단일 문자열 대신 항상 배열을 반환하면됩니다. 예를 들면 다음과 같습니다.

public static string[] GetAllLocalIPv4(NetworkInterfaceType _type)
{
    List<string> ipAddrList = new List<string>();
    foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
        {
            foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
            {
                if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
                {
                    ipAddrList.Add(ip.Address.ToString());
                }
            }
        }
    }
    return ipAddrList.ToArray();
}

이제이 함수는 특정 인터페이스 유형에 할당 된 모든 주소를 반환합니다. 이제 단일 문자열을 얻으려면 .FirstOrDefault()확장을 사용 하여 배열의 첫 번째 항목을 반환하거나 비어있는 경우 빈 문자열을 반환 할 수 있습니다.

GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();

5
많은 장소에서 DNS 유용성이없고 인터페이스가 여러 IP 주소를 가질 수 있기 때문에 이것은 더 나은 솔루션입니다. 나는 또한 비슷한 방법을 사용합니다.
Mert Gülsoy

이것의 문제는 인터페이스 당 하나의 IP 주소 만 반환한다는 것입니다. 마지막 IP는 foreach입니다.
Nas Banov

@ compman2408-사실이 아닙니다. 단일 인터페이스에는 여러 개의 IP가있을 수 있습니다 . 모든 콤보에 대한 en.wikipedia.org/wiki/Multihoming#Variants 를 참조하십시오 . 명백한 예는 IPv4와 IPv6을 모두 실행할 때이지만 과거에는 단일 이더넷 어댑터가 여러 IPv4 네트워크에 참여했습니다. 특이 할 수도 있지만 완벽하게 합법적 일 수 있습니다. 예를 들어 Windows의 경우 windowsnetworking.com/articles-tutorials/windows-2003/…을
Nas Banov

@NasBanov이 함수는 IPv4 주소 만 가져 오도록 설정되었으므로 IPv6 및 현재 쓸모없는 것에 대해 이야기하지 않겠습니다. 멀티 호밍을 여러 인터페이스의 여러 네트워크에 연결하는 것으로 알고 있지만 동일한 인터페이스의 여러 네트워크에 연결 한 적이 없습니다. 실제로 가능하다는 것이 옳은 것처럼 보이지만 NIC를 사용하는 사람들의 <1 %는 대신 배열을 반환하도록 함수를 변경해야합니다.
compman2408

1
감사합니다. 참고로 적어도 OSX의 .NET 3.5 모노에서는 item.OperationalStatus항상을 반환합니다 Unknown.
gman

36

다음은 나를 위해 일한 수정 된 버전 (compman2408의 버전)입니다.

    internal static string GetLocalIPv4(NetworkInterfaceType _type)
    {  // Checks your IP adress from the local network connected to a gateway. This to avoid issues with double network cards
        string output = "";  // default output
        foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) // Iterate over each network interface
        {  // Find the network interface which has been provided in the arguments, break the loop if found
            if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
            {   // Fetch the properties of this adapter
                IPInterfaceProperties adapterProperties = item.GetIPProperties();
                // Check if the gateway adress exist, if not its most likley a virtual network or smth
                if (adapterProperties.GatewayAddresses.FirstOrDefault() != null)
                {   // Iterate over each available unicast adresses
                    foreach (UnicastIPAddressInformation ip in adapterProperties.UnicastAddresses)
                    {   // If the IP is a local IPv4 adress
                        if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        {   // we got a match!
                            output = ip.Address.ToString();
                            break;  // break the loop!!
                        }
                    }
                }
            }
            // Check if we got a result if so break this method
            if (output != "") { break; }
        }
        // Return results
        return output;
    }

이 메소드를 다음과 같이 호출 할 수 있습니다.

GetLocalIPv4(NetworkInterfaceType.Ethernet);

변경 사항 : 게이트웨이 IP가 할당 된 어댑터에서 IP를 검색하고 있습니다. 두 번째 변경 사항 :이 방법을보다 효율적으로 만들기 위해 docstrings 및 break 문을 추가했습니다.


2
영리한 솔루션. 나는 지금 이것을 사용하고 있습니다.
RQDQ

4
코드에서 파생 된 코드와 같은 문제가 있습니다. IP 중 하나, 많은 IP에서 임의의 IP를 반환합니다. 필요하지 않아도됩니다. 그것은 ademiller.com/blogs/tech/2008/06/it-works-on-my-machine-award를
Nas Banov

1
@NasBanov, 물론 나는 내 게시물에서 언급 한대로 "나를 위해 일했다"고 그것을 얻었습니다. :-)
Gerardo H

이것은 갈 길입니다. 감사합니다. 에뮬레이터 용 루프백 스위치가 설치되어 있으면 성공한 다른 모든 변형이 실패합니다!
DiamondDrake

1
첫 번째가 아니라 마지막으로 찾은 IP 주소 만 반환하는 이유는 무엇입니까? break가장 내면의 if또는 단순한 return속임수는 트릭을 수행합니다.
마틴 멀더

20

이것은 VMWare 호스트 또는 기타 유효하지 않은 IP 주소를 피하면서 현재 IP를 얻는 가장 좋은 코드입니다.

public string GetLocalIpAddress()
{
    UnicastIPAddressInformation mostSuitableIp = null;

    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

    foreach (var network in networkInterfaces)
    {
        if (network.OperationalStatus != OperationalStatus.Up)
            continue;

        var properties = network.GetIPProperties();

        if (properties.GatewayAddresses.Count == 0)
            continue;

        foreach (var address in properties.UnicastAddresses)
        {
            if (address.Address.AddressFamily != AddressFamily.InterNetwork)
                continue;

            if (IPAddress.IsLoopback(address.Address))
                continue;

            if (!address.IsDnsEligible)
            {
                if (mostSuitableIp == null)
                    mostSuitableIp = address;
                continue;
            }

            // The best IP is the IP got from DHCP server
            if (address.PrefixOrigin != PrefixOrigin.Dhcp)
            {
                if (mostSuitableIp == null || !mostSuitableIp.IsDnsEligible)
                    mostSuitableIp = address;
                continue;
            }

            return address.Address.ToString();
        }
    }

    return mostSuitableIp != null 
        ? mostSuitableIp.Address.ToString()
        : "";
}

왜이 코드가 답을위한 솔루션인지 설명해야합니다. 인터넷에 연결되어있는 경우 실제로 질문에 대한 답변을 얻을 수 있습니까? 그러면 오류가 발생합니까?
Philipp M

다른 방법으로는 IsDnsEligible 및 PrefixOrigin 유효성 검사를 사용하지 않습니다.
rodcesar.santos

@PhilippM 주소가 DNS 적격이 아닌 경우 예약 된 내부 IP입니다. 인터넷 제공 업체가 아닙니다. 그리고 PrefixOrigin이 DHCP 서버에 의해 지원 되었다면, 이것이 최선의 주소 선택 일 것입니다. 이것은 나에게 작동하는 독특한 기능입니다!
rodcesar.santos

1
@ user1551843-감사합니다. 예전의 감가 상각 된 GetHostByName 메소드를 사용하고 있었지만 VMWare 어댑터의 IP를 리턴했습니다.
Jason Newland

이것은 VPN + 무선에서 나를 위해 일한 유일한 솔루션이었습니다. 감사합니다.
jay-danger

12

LinQ를 사용하는 것이 더 쉽다고 생각합니다.

Dns.GetHostEntry(Dns.GetHostName())
   .AddressList
   .First(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
   .ToString()

14
그것은 LINQ가 아니며 확장 방법과 람다입니다. 차이가 있습니다.
Mark

10
@Mark- "using System.Linq;"를 추가하지 않으면 그래도 "First"확장 방법을 사용할 수 없습니다
BornToCode

5
확장 메서드는 System.Linq 네임 스페이스에있는 Enumerable 클래스에 있기 때문입니다. 여전히 LINQ가 아닙니다.
Mark

20
이 짧은 형식으로도 표시는 실제로 LINQ-to-objects를 사용하여 method (lambda) 구문으로 표시됩니다. 쿼리 구문은 단순히 구문상의 설탕으로, IEnumerable 확장 메서드 호출 체인으로 컴파일되는 LINQ-to-Objects입니다. 출처 : LINQ-to-SQL 공급자 및 해당 주제에 대한 일련의 기사를 작성했습니다.
Constantine g


9

웃음을 위해 새로운 C # 6 null 조건부 연산자를 사용하여 단일 LINQ 문을 사용하려고합니다. 꽤 미쳤고 아마도 비효율적으로 보이지만 작동합니다.

private string GetLocalIPv4(NetworkInterfaceType type = NetworkInterfaceType.Ethernet)
{
    // Bastardized from: http://stackoverflow.com/a/28621250/2685650.

    return NetworkInterface
        .GetAllNetworkInterfaces()
        .FirstOrDefault(ni =>
            ni.NetworkInterfaceType == type
            && ni.OperationalStatus == OperationalStatus.Up
            && ni.GetIPProperties().GatewayAddresses.FirstOrDefault() != null
            && ni.GetIPProperties().UnicastAddresses.FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork) != null
        )
        ?.GetIPProperties()
        .UnicastAddresses
        .FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork)
        ?.Address
        ?.ToString()
        ?? string.Empty;
}

논리적 인 의례 Gerardo H(및 참조 compman2408).


확실히 재미 있지만 (+1) 실제로 비효율적 일 필요는 없습니다. LISP 또는 Forth :-)에서의 프로그래밍을 생각 나게합니다
Roland

6

linq 표현식을 사용하여 IP를 얻는 다른 방법 :

public static List<string> GetAllLocalIPv4(NetworkInterfaceType type)
{
    return NetworkInterface.GetAllNetworkInterfaces()
                   .Where(x => x.NetworkInterfaceType == type && x.OperationalStatus == OperationalStatus.Up)
                   .SelectMany(x => x.GetIPProperties().UnicastAddresses)
                   .Where(x => x.Address.AddressFamily == AddressFamily.InterNetwork)
                   .Select(x => x.Address.ToString())
                   .ToList();
}

5

@mrcheif 오늘이 답변을 찾았으며 코드가 작동하지 않기 때문에 잘못된 IP를 반환했지만 히 마치 실행과 같은 일이있을 때 잘못된 인터 네트워크 IP를 제공했지만 매우 유용했습니다.

public static string localIPAddress()
{
    IPHostEntry host;
    string localIP = "";
    host = Dns.GetHostEntry(Dns.GetHostName());

    foreach (IPAddress ip in host.AddressList)
    {
        localIP = ip.ToString();

        string[] temp = localIP.Split('.');

        if (ip.AddressFamily == AddressFamily.InterNetwork && temp[0] == "192")
        {
            break;
        }
        else
        {
            localIP = null;
        }
    }

    return localIP;
}

2
Logmein Hamachi을 의미합니까? VPN 솔루션이며 네트워크 스택을 고려합니다. 또한 VPN이기 때문에 VPN 할당 된 IP를 연결하면 반환하는 것이 합리적입니다 (제 추측대로).
Mr.

2
완전히 신뢰할 수 없습니다. 192.0.0.0/8개인 IP 주소에 대한 올바른 테스트 일뿐만 아니라 (이것과는 다른 3 개의 범위가 있음) 회사 네트워크 범위 일 수 있으므로 "로컬"은 아닙니다.
ivan_pozdeev

5

하나 이상의 LAN 카드 및 가상 시스템으로 테스트

public static string DisplayIPAddresses()
    {
        string returnAddress = String.Empty;

        // Get a list of all network interfaces (usually one per network card, dialup, and VPN connection)
        NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface network in networkInterfaces)
        {
            // Read the IP configuration for each network
            IPInterfaceProperties properties = network.GetIPProperties();

            if (network.NetworkInterfaceType == NetworkInterfaceType.Ethernet &&
                   network.OperationalStatus == OperationalStatus.Up &&
                   !network.Description.ToLower().Contains("virtual") &&
                   !network.Description.ToLower().Contains("pseudo"))
            {
                // Each network interface may have multiple IP addresses
                foreach (IPAddressInformation address in properties.UnicastAddresses)
                {
                    // We're only interested in IPv4 addresses for now
                    if (address.Address.AddressFamily != AddressFamily.InterNetwork)
                        continue;

                    // Ignore loopback addresses (e.g., 127.0.0.1)
                    if (IPAddress.IsLoopback(address.Address))
                        continue;

                    returnAddress = address.Address.ToString();
                    Console.WriteLine(address.Address.ToString() + " (" + network.Name + " - " + network.Description + ")");
                }
            }
        }

       return returnAddress;
    }

이것은 이더넷에서만 작동한다는 것을 명심하십시오. Wi-Fi를 지원하려면 NetworkInterfaceType 제한을 제거하십시오.
scor4er

3

LINQ를 사용하여 업데이트 된 버전의 광산 :

/// <summary>
/// Gets the local Ipv4.
/// </summary>
/// <returns>The local Ipv4.</returns>
/// <param name="networkInterfaceType">Network interface type.</param>
IPAddress GetLocalIPv4(NetworkInterfaceType networkInterfaceType)
{
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces().Where(i => i.NetworkInterfaceType == networkInterfaceType && i.OperationalStatus == OperationalStatus.Up);

    foreach (var networkInterface in networkInterfaces)
    {
        var adapterProperties = networkInterface.GetIPProperties();

        if (adapterProperties.GatewayAddresses.FirstOrDefault() == null)
                continue;
        foreach (var ip in networkInterface.GetIPProperties().UnicastAddresses)
        {
            if (ip.Address.AddressFamily != AddressFamily.InterNetwork)
                    continue;

            return ip.Address;
        }
    }

    return null;
}

2

전제 조건 : System.Data.Linq 참조를 추가하고 참조해야합니다.

using System.Linq;
string ipAddress ="";
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
ipAddress = Convert.ToString(ipHostInfo.AddressList.FirstOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork));

2

또한 올바른 IP를 얻는 데 어려움을 겪고있었습니다.

나는 여기에서 다양한 솔루션을 시도했지만 원하는 효과를 제공하지 못했습니다. 제공된 거의 모든 조건부 테스트로 인해 주소가 사용되지 않았습니다.

이것이 나를 위해 일한 것입니다. 도움이되기를 바랍니다 ...

var firstAddress = (from address in NetworkInterface.GetAllNetworkInterfaces().Select(x => x.GetIPProperties()).SelectMany(x => x.UnicastAddresses).Select(x => x.Address)
                    where !IPAddress.IsLoopback(address) && address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork
                    select address).FirstOrDefault();

Console.WriteLine(firstAddress);

1
string str="";

System.Net.Dns.GetHostName();

IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(str);

IPAddress[] addr = ipEntry.AddressList;

string IP="Your Ip Address Is :->"+ addr[addr.Length - 1].ToString();

STR은 항상 비어
aj.toulan

1

일반적으로 여러 NAT 변환이 진행되고 각각 다른 NAT 변환 수준에서 작동하는 여러 DNS 서버가있을 수 있습니다.

이동 통신사 등급 NAT가 있고 동일한 이동 통신사의 다른 고객과 의사 소통을하려면 어떻게해야합니까? 일반적으로 모든 NAT 변환에서 다른 호스트 이름으로 나타날 수 있으므로 확실하지 않습니다.


1

쓸모없는, 이것은 나에게 작동

public static IPAddress GetIPAddress()
{ 
 IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => 
 address.AddressFamily == AddressFamily.InterNetwork).First();
 return ip;
}

1

Linq와 함께 Mr Chief의 답변을 업데이트하면 다음과 같은 이점이 있습니다.

public static IPAddress GetLocalIPAddress()
{
   var host = Dns.GetHostEntry(Dns.GetHostName());
   var ipAddress= host.AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
   return ipAddress;
}

1

그러면 게이트웨이 주소와 유니 캐스트 주소가있는 두 인터페이스 (IPV4 및 IPV6)의 인터페이스에서 주소가 반환됩니다.

public static (List<IPAddress> V4, List<IPAddress> V6) GetLocal()
{
    List<IPAddress> foundV4 = new List<IPAddress>();
    List<IPAddress> foundV6 = new List<IPAddress>();

    NetworkInterface.GetAllNetworkInterfaces().ToList().ForEach(ni =>
    {
        if (ni.GetIPProperties().GatewayAddresses.FirstOrDefault() != null)
        {
            ni.GetIPProperties().UnicastAddresses.ToList().ForEach(ua =>
            {
                if (ua.Address.AddressFamily == AddressFamily.InterNetwork) foundV4.Add(ua.Address);
                if (ua.Address.AddressFamily == AddressFamily.InterNetworkV6) foundV6.Add(ua.Address);
            });
        }
    });

    return (foundV4.Distinct().ToList(), foundV6.Distinct().ToList());
}

깔끔한 솔루션 :
요한 프란 젠

1

이미 많은 답변이 있지만 여전히 내 질문에 기여하고 있습니다.

public static IPAddress LocalIpAddress() {
    Func<IPAddress, bool> localIpPredicate = ip =>
        ip.AddressFamily == AddressFamily.InterNetwork &&
        ip.ToString().StartsWith("192.168"); //check only for 16-bit block
    return Dns.GetHostEntry(Dns.GetHostName()).AddressList.LastOrDefault(localIpPredicate);
}

짧막 한 농담:

public static IPAddress LocalIpAddress() => Dns.GetHostEntry(Dns.GetHostName()).AddressList.LastOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork && ip.ToString().StartsWith("192.168"));

참고 : MobileHotspot, VPN 또는 기타 고급 가상 어댑터와 같은 일부 인터페이스가 장치에 추가 된 후에도 계속 작동했기 때문에 마지막부터 검색하십시오.


1
로컬 IP가 10.0.2.3이면 찾을 수 없습니까? 이 코드에서는 정말 이상합니다.
frankhommers

@frankhommers 된 상기 16 비트 블록에 대해서만 체크
nyconing

16 개 비트 블록은 뭔가 다른 192.168보다 수
frankhommers

0

또한 클라이언트 Ip를 얻는 간단한 코드 :

        public static string getclientIP()
        {
            var HostIP = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";
            return HostIP;
        }

그것이 당신을 돕기를 바랍니다.


0
Dns.GetHostEntry(Dns.GetHostName()).AddressList[1].MapToIPv4() //returns 192.168.14.1

여기에 이미지 설명을 입력하십시오


5
답변에는 OP의 경우와 향후 독자에게 어떻게 작동하는지에 대한 설명이 포함되어야합니다.
Ronak Dhoot

미래 독자를위한 답변에 대한 설명을 포함하는 것이 좋습니다.
Nicolas Gervais

0

각각을 반복 할 수 있도록 수정 된 compman2408의 코드 NetworkInterfaceType.

public static string GetLocalIPv4 (NetworkInterfaceType _type) {
    string output = null;
    foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces ()) {
        if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up) {
            foreach (UnicastIPAddressInformation ip in item.GetIPProperties ().UnicastAddresses) {
                if (ip.Address.AddressFamily == AddressFamily.InterNetwork) {
                    output = ip.Address.ToString ();
                }
            }
        }
    }
    return output;
}

다음과 같이 호출 할 수 있습니다.

static void Main (string[] args) {
    // Get all possible enum values:
    var nitVals = Enum.GetValues (typeof (NetworkInterfaceType)).Cast<NetworkInterfaceType> ();

    foreach (var nitVal in nitVals) {
        Console.WriteLine ($"{nitVal} => {GetLocalIPv4 (nitVal) ?? "NULL"}");
    }
}

0
Imports System.Net
Imports System.Net.Sockets
Function LocalIP()
    Dim strHostName = Dns.GetHostName
    Dim Host = Dns.GetHostEntry(strHostName)
    For Each ip In Host.AddressList
        If ip.AddressFamily = AddressFamily.InterNetwork Then
            txtIP.Text = ip.ToString
        End If
    Next

    Return True
End Function

동일한 행동 아래

LocalIP () 함수

호스트로 문자열 희미 = Dns.GetHostEntry (Dns.GetHostName) .AddressList (1) .MapToIPv4.ToString

txtIP.Text = 호스트

참 반환

최종 기능


아래 예제는 동일한 동작 기능 LocalIP () Dim Host As String = Dns.GetHostEntry (Dns.GetHostName) .AddressList (1) .MapToIPv4.ToString txtIP.Text = 호스트 반환 True End 함수
YongJae Kim

-2
Dns.GetHostEntry(Dns.GetHostName()).AddressList[1]

한 줄의 코드 : D


7
경우에 따라 OutOfRangeException이 발생할 수 있습니다.
Loudenvier

5
또한 원하는 것을 어떻게 알 수 있습니까? 당신에게 옳은 것은 다른 사람에게 잘못되었을 수 있습니다.
Mark

-3

가상 머신이나 추가 네트워크 카드가있는 경우 주소 목록에 다른 값이있을 수 있습니다. 내 제안은 주소 목록의 항목을 확인하고 적절한 것을 인쇄하는 것입니다. 필자의 경우 항목 3은 내 컴퓨터의 ipv4 주소입니다.

IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddr = ipHost.AddressList[3];
string ip = ipAddr.ToString();

추가하는 것을 잊지 마십시오 using System.Net;


1
보정; 그들 모두는 당신의 기계의 IP 주소입니다. 그러나 당신이 원하는 것은 완전히 다른 이야기입니다. 순서는 변경 될 수 있으며 사용중인 방법으로 인해 항상 추측해야합니다.
Mark

그것이 내가 말한 것입니다, 당신은 addresslist의 항목을 확인해야합니다, 그리고 그것은 추측입니다. 그러나 모든 항목을 본 후에는 추측하기가 어렵지 않습니다
Bibaswann Bandyopadhyay

어느 것이 적합한 지 어떻게 알 수 있습니까? compman2048의 솔루션을 사용하면 어느 인터페이스에 어떤 인터페이스가 연결되어 있는지 알 수 있습니다.
Mark

2 개의 무선 인터페이스, 2 개의 가상 머신 및 1 개의 에뮬레이터를 가지고 있기 때문에이 솔루션은 내 컴퓨터에서 작동하지 않아서 많은 IP를 얻었습니다. 당신이 라우터에서 제공하는 내부 주소를 찾고 있다면 그러나 내가 이해하는 방법을 그건, 192 또는 172 또는 10로 시작합니다
Bibaswann Bandyopadhyay에게

라우터가 공용 IP를 전달하지 않는 한 드문 일이지만 가능합니다.
Mark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.