ASP.NET에서 사용자의 클라이언트 IP 주소를 얻는 방법은 무엇입니까?


387

우리는이 Request.UserHostAddressASP.NET에서 IP 주소를 얻을 수 있지만, 일반적으로 사용자의 ISP의 IP 주소, 예를 들어, 링크를 클릭하지 정확하게 사용자의 컴퓨터의 IP 주소입니다. 실제 IP 주소는 어떻게 얻을 수 있습니까?

예를 들어, Stack Overflow 사용자 프로필에서 "마지막 계정 활동 : 4 시간 전부터 86.123.127.8" 이지만 내 컴퓨터 IP 주소는 약간 다릅니다. 스택 오버플로는이 주소를 어떻게 얻습니까?

일부 웹 시스템에는 몇 가지 목적으로 IP 주소 확인이 있습니다. 예를 들어 특정 IP 주소를 사용하면 24 시간마다 다운로드 링크를 5 번만 클릭 할 수 있습니까? 이 IP 주소는 광범위한 클라이언트 또는 인터넷 사용자가있는 ISP가 아닌 고유해야합니다.

잘 이해 했습니까?


4
그들은 일반적으로 같은 일을하고 공유 IP 주소에 대해 올바르게 작동하지 않습니다. 이 분야에서는 많은 것을 할 수 없습니다.
Mehrdad Afshari

여기서 해결하려는 문제는 무엇이며 왜 IP 주소가 필요하다고 생각하십니까?
Steve

3
특정 링크 클릭을 확인하는 응용 프로그램이 있으며 특정 사용자 (IP 별)가 하루에 5 번 이상 링크를 클릭 할 수 없습니다 .Request.UserHostAddress가 ISP 또는 네트워크에서 사용자 범위에 해당하는 경우 또는 특정 사용자의 것?
Mehdi

답변:


142

다른 사람들이 말했듯이 당신은 당신이 요구하는 것을 할 수 없습니다. 당신이 해결하려고하는 문제를 설명한다면 누군가 도울 수 있습니까?

예 :

  • 사용자를 고유하게 식별하려고합니까?
  • IP 주소 대신 쿠키 또는 세션 ID를 사용할 수 있습니까?

편집하다서버에서 볼 수있는 주소는 ISP의 주소가 아니어야합니다. 광대역의 가정 사용자 주소는 라우터의 주소가되므로 집 안의 모든 장치는 외부에 동일하게 표시되지만 라우터는 NAT를 사용하여 트래픽이 각 장치로 올바르게 라우팅되도록합니다. 사무실 환경에서 액세스하는 사용자의 경우 주소가 모든 사용자에게 동일 할 수 있습니다. ID에 IP 주소를 사용하는 사이트는 매우 잘못 될 위험이 있습니다. 제공 한 예제는 좋은 것이며 종종 실패합니다. 예를 들어, 제 사무실은 영국에 있고, 인터넷에 "나타나는"것으로 보이는 브레이크 아웃 지점은 주요 IT 시설이있는 다른 국가에 있기 때문에 제 사무실에서 내 IP 주소는 영국에없는 것으로 보입니다. 이런 이유로 영국의 웹 콘텐츠에만 액세스 할 수 없습니다. BBC iPlayer와 같은). 주어진 시간에 우리 회사에는 같은 IP 주소로 웹에 액세스하는 것으로 보이는 수백 또는 수천 명의 사람들이있을 것입니다.

서버 코드를 작성할 때 IP 주소가 무엇을 참조하는지 확신 할 수 없습니다. 일부 사용자는이 방법을 좋아합니다. 일부 사람들은 의도적으로 프록시 나 VPN을 사용하여 더 혼란스러워합니다.

컴퓨터 주소가 StackOverflow에 표시된 IP 주소와 다르다고 말할 때 컴퓨터 주소를 어떻게 알 수 있습니까? 로컬로 사용 ipconfig하거나 그와 비슷한 것을 보고 있다면 위에서 설명한 이유로 다를 수 있습니다. 외부 세계가 생각하는 것을 다시 확인하려면 whatismyipaddress.com/을 살펴 보십시오 .

NAT 의이 Wikipedia 링크 는 이에 대한 배경 지식을 제공합니다.


그래서 서버 측 애플리케이션에서 IP 주소를 확신 할 수 없다는 것을 이해했습니다. 그것은 클라이언트 측 프로그래밍이 해결책이라는 것을 의미합니다 ?? 예를 들어 일부 JavaScript 코드를 사용하면 그렇게 할 수 있습니까 ??
Mehdi

11
아니요, 이것은 의미가 없습니다. 고객이 집이나 사무실 내부에서 "생각"할 IP 주소는 외부 세계에서는 의미가 없습니다. 예를 들어 대부분의 가정용 라우터는 192.168.1.xxx 범위의 IP 주소를 전달하므로 수천 대의 컴퓨터가 자체 네트워크에서 동일한 주소를 갖습니다.
Steve

12
아니요, 고유하지 않습니다. NAT를 사용하여 동일한 라우터 뒤에있는 두 명의 사용자는 동일한 IP 주소를 갖습니다. 나는 정말로 이것에 대해 읽어야한다고 생각합니다. 내 편집의 링크를 참조하십시오.
Steve

1
그렇다면 AWS, Azure 등의 회사가 보안 그룹 규칙에서 IP 주소를 사용하고 해당 IP 주소 만 VM에 연결하도록 허용하는 이유는 무엇입니까?

2
@ user5950947 : Azure는 고정 공용 IP 주소를 가진 회사가되기를 기대하기 때문에. 회사가 공개 IP 주소에서만 액세스 할 것이라고 가정하는 것이 안전하므로 추가 된 보안 기능입니다. 그러나 IP 주소가 위조되거나 네트워크가 해킹 될 수 있으므로 유일한 보안이되어서는 안됩니다.
Deantwo

449

웹 사이트를 방문하는 사람의 IP 주소를 알고 싶을 때가 있습니다. ASP.NET에는이 방법을 수행하는 여러 가지 방법이 있지만 ServerVariables 컬렉션의 "HTTP_X_FORWARDED_FOR"을 사용하는 것이 가장 좋습니다.

이유는 ...

때때로 방문자가 프록시 서버 나 라우터 뒤에 있고 표준 Request.UserHostAddress은 프록시 서버 나 라우터의 IP 주소 만 캡처합니다. 이 경우 사용자의 IP 주소는 서버 변수 ( "HTTP_X_FORWARDED_FOR")에 저장됩니다.

그래서 우리가하고 싶은 것은 먼저 "HTTP_X_FORWARDED_FOR"를 확인하는 것입니다. 만약 이것이 비어 있다면 간단히 반환 ServerVariables("REMOTE_ADDR")합니다.

이 방법은 완벽하지는 않지만 더 나은 결과를 얻을 수 있습니다. 다음은 James Crowley의 블로그 게시물 "Gotcha : HTTP_X_FORWARDED_FOR에서 여러 IP 주소를 반환 함" 에서 가져온 VB.NET의 ASP.NET 코드입니다 .

씨#

protected string GetIPAddress()
{
    System.Web.HttpContext context = System.Web.HttpContext.Current; 
    string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    if (!string.IsNullOrEmpty(ipAddress))
    {
        string[] addresses = ipAddress.Split(',');
        if (addresses.Length != 0)
        {
            return addresses[0];
        }
    }

    return context.Request.ServerVariables["REMOTE_ADDR"];
}

VB.NET

Public Shared Function GetIPAddress() As String
    Dim context As System.Web.HttpContext = System.Web.HttpContext.Current
    Dim sIPAddress As String = context.Request.ServerVariables("HTTP_X_FORWARDED_FOR")
    If String.IsNullOrEmpty(sIPAddress) Then
        Return context.Request.ServerVariables("REMOTE_ADDR")
    Else
        Dim ipArray As String() = sIPAddress.Split(New [Char]() {","c})
        Return ipArray(0)
    End If
End Function

24
누구나 HTTP_X_FORWARDED_FOR 또는 유사한 헤더를 위조 할 수 있으므로 보안 목적으로이 코드를 사용하지 마십시오. 따라서 보안 관련 로깅 또는 보안 검사에이 기능을 사용하면 공격자가이를 쉽게 우회 할 수 있습니다.
박사. 이블

4
귀하의 링크에서 what we actually needed to be doing was take the last IP address코드가 첫 번째 코드를 가져옵니다 addresses[0]. 어느 것이 맞습니까?
Nelson Rothermel 17 년

4
@NelsonRothermel 이전 프록시가 아닌 클라이언트를 원할 경우 en.wikipedia.org/wiki/X-Forwarded-For#Format을 기반으로 하고 첫 번째 를 사용하십시오 .
Richard

4
@ dr.evil 그렇다면 무엇을 제안 하시겠습니까? 지정된 IP로 WCF 서비스에 대한 액세스를 설정하려고하기 때문입니다.
krypru

7
addresses.Length != 00이 될 수 없기 때문에 필요하지 않습니다.
James Wilkins

78

업데이트 : Bruno Lopes에게 감사드립니다. 여러 IP 주소가 올 수 있으면이 방법을 사용해야합니다.

    private string GetUserIP()
    {
        string ipList = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

        if (!string.IsNullOrEmpty(ipList))
        {
            return ipList.Split(',')[0];
        }

        return Request.ServerVariables["REMOTE_ADDR"];
    }

3
다른 답변에서 언급했듯이 HTTP_X_FORWARDED_FOR은 쉼표로 구분 된 IP 목록 일 수 있습니다.
Bruno Lopes

함수에 응답하여 매번 :: 1을 얻습니다. 완전한 IP 주소를 얻을 수 없습니까 ???
farhangdon

1
로컬 호스트에서 :: 1을 반환합니다. productino 환경에서 사용해보십시오. 괜찮습니다.
Benny Margalit

1
@Bat_Programmer 아래 쓴 @farhangdon, 다음 코드는 로컬 호스트에 주소를 IP 돌아갑니다System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
베니 마르 갈 리트를

이러지 마! 목록에서 첫 번째 IP 주소를 사용하지 않도록주의하십시오. 중간자 (man-in-the-middle) 공격 및 헤더 스푸핑을 방지하려면 가장 오른쪽에있는 알려진 프록시 IP 만 건너 뛰어야합니다.
Jpsy

24

C #이 이런 식으로 보이면 매우 간단합니다.

string clientIp = (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? 
                   Request.ServerVariables["REMOTE_ADDR"]).Split(',')[0].Trim();

8
두 서버 변수가 모두 널이 될 수 있으면 예외가 발생할 수 있습니다.
Michael Freidgeim

요청 참조 란 무엇입니까? ServerVariables를 찾을 수 없음
Brownbagger11

23

다른 사용자 IP 주소는 무엇입니까? 네트워크 어댑터의 IP 주소를 원한다면 웹 응용 프로그램에서 IP 주소를 사용할 수있는 방법이 없습니다. 사용자가 NAT 나 다른 것들 뒤에 있다면 IP를 얻을 수 없습니다.

업데이트 : IP를 사용하여 사용자를 제한하는 웹 사이트 (예 : rapidshare)가 있지만 NAT 환경에서는 제대로 작동하지 않습니다.


22

내 경험을 모두와 공유해야한다고 생각합니다. 어떤 상황에서는 REMOTE_ADDR이 보입니다. 이 원하는 것을 얻지 못할 것입니다. 예를 들어, 씬 뒤에로드 밸런서가 있고 클라이언트의 IP를 얻으려고하면 문제가 발생합니다. IP 마스킹 소프트웨어로 확인했으며 다른 대륙에있는 동료들도 확인했습니다. 그래서 여기 내 해결책이 있습니다.

고객의 IP를 알고 자 할 때 가능한 모든 증거를 선택하여 고유한지 판단 할 수 있도록합니다.

여기서 클라이언트 측의 정확한 IP를 얻으려면 모든 도움이 될 수있는 다른 서버를 찾았습니다. 그래서 사용하고 있습니다 : HTTP_X_CLUSTER_CLIENT_IP

HTTP_X_CLUSTER_CLIENT_IP는 항상 클라이언트의 정확한 IP를 얻습니다. 그 당신에게 가치를 포기하지 않을 경우 어떤 경우에, 당신은 다음을 찾아야한다 HTTP_X_FORWARDED_FOR 그것은 당신에게 클라이언트 IP를 얻을 수있는 최고의 두 번째 후보하고 같이 REMOTE_ADDR가 반환하거나 반환하지 않을 수 var를 찾으십시오. 세 가지는 내가 그들을 모니터링하는 가장 좋은 것입니다.

이것이 일부 사람들에게 도움이되기를 바랍니다.


http_x _... 헤더는 remote_addr 변수와 관련하여 쉽게 스푸핑 될 수 있습니다. 따라서 remote_addr은 클라이언트 IP 주소의 가장 안정적인 소스로 남아 있습니다.
Ciro Corvino

1
@CiroCorvino 당신 말이 맞지만 Load Balancer 뒤에서 실행되는 서버에서 웹 사이트를 호스팅하면 (내 게시물에서 이미 언급했듯이) remote_addr은 찾고있는 IP를 제공하지 않습니다. 나는 당신이 말하는 것을 경험했지만 솔루션에 파고 들었을 때 내가 말한 것이 나에게 가장 효과적입니다.
KMX

@KMX 죄송합니다. 실제로 remote_addr과 http_x_forwarded의 조합을 사용하여 요청의 출처에 대한 몇 가지 가정을 유추합니다. 게시물을 수정하면 투표가 업데이트됩니다
Ciro Corvino

15

당신이 사용할 수있는:

System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.GetValue(0).ToString();

1
고마워, 이것은 로컬 호스트에서 실제로 내 IP를 반환하는 유일한 방법입니다.
Benny Margalit

내가 로컬 호스트 IP 주소를 얻는 데 실제로 사용한 것은System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
Benny Margalit

1
이 코드는 나에게만 적합하며 각각 GetValue (0) 및 GetValue (1)을 사용하여 IPv6 및 IPv4를 얻을 수 있습니다. 감사합니다.
Raj Baral

그러나 바이올린에서 실행하는 동안 오류가 발생했습니다. Request for the permission of type 'System.Net.DnsPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
vibs2006

OP는 자신의 로컬 호스트 주소가 아닌 원격 웹 사용자의 IP를 얻는 방법을 묻습니다.
t.durden

13

IP 주소는 "7 계층 스택"에서 네트워크 계층의 일부입니다. 네트워크 계층은 IP 주소로 원하는 모든 작업을 수행 할 수 있습니다. 이것이 프록시 서버, NAT, 릴레이 등에서 일어나는 일입니다.

응용 프로그램 계층은 어떤 식 으로든 IP 주소에 의존해서는 안됩니다. 특히, IP 주소는 네트워크 연결의 한 쪽 끝의 아이디 이외의 식별자가 아닙니다. 연결이 종료 되 자마자 같은 사용자의 IP 주소가 변경 될 것으로 예상해야합니다.


1
다 잘됐지만 멀티 테넌트 시스템의 한 고객이 자신의 사용자 계정이 지정된 IP 주소에서만 로그인 할 수 있도록 요구하면 어떻게해야합니까?
Ronnie Overby

1
그런 다음 서버에서 볼 IP 주소를 알려 주어야합니다. 특정 주소가 필요한 경우 NAT 뒤에 있거나 유사한 주소가 될 수 없습니다.
John Saunders

@RonnieOverby 같은 상황에 처해 있습니다. 그들이 연결하는 IP가 무엇인지 알아야하며 허용 목록에 있어야합니다. 그런 다음 앱은 IP를 기반으로 특정 기능을 켜거나 끌 수 있습니다. 고객이 원하는 것입니다.
t.durden

10

지금까지 모든 응답은 표준화되지 않았지만 매우 일반적인 X-Forwarded-For헤더를 고려합니다. Forwarded파싱하기가 좀 더 어려운 표준화 된 헤더가 있습니다. 몇 가지 예는 다음과 같습니다.

Forwarded: for="_gazonk"
Forwarded: For="[2001:db8:cafe::17]:4711"
Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43
Forwarded: for=192.0.2.43, for=198.51.100.17

클라이언트의 IP 주소를 결정할 때 두 헤더를 모두 고려하는 클래스를 작성했습니다.

using System;
using System.Web;

namespace Util
{
    public static class IP
    {
        public static string GetIPAddress()
        {
            return GetIPAddress(new HttpRequestWrapper(HttpContext.Current.Request));
        }

        internal static string GetIPAddress(HttpRequestBase request)
        {
            // handle standardized 'Forwarded' header
            string forwarded = request.Headers["Forwarded"];
            if (!String.IsNullOrEmpty(forwarded))
            {
                foreach (string segment in forwarded.Split(',')[0].Split(';'))
                {
                    string[] pair = segment.Trim().Split('=');
                    if (pair.Length == 2 && pair[0].Equals("for", StringComparison.OrdinalIgnoreCase))
                    {
                        string ip = pair[1].Trim('"');

                        // IPv6 addresses are always enclosed in square brackets
                        int left = ip.IndexOf('['), right = ip.IndexOf(']');
                        if (left == 0 && right > 0)
                        {
                            return ip.Substring(1, right - 1);
                        }

                        // strip port of IPv4 addresses
                        int colon = ip.IndexOf(':');
                        if (colon != -1)
                        {
                            return ip.Substring(0, colon);
                        }

                        // this will return IPv4, "unknown", and obfuscated addresses
                        return ip;
                    }
                }
            }

            // handle non-standardized 'X-Forwarded-For' header
            string xForwardedFor = request.Headers["X-Forwarded-For"];
            if (!String.IsNullOrEmpty(xForwardedFor))
            {
                return xForwardedFor.Split(',')[0];
            }

            return request.UserHostAddress;
        }
    }
}

아래는 솔루션을 검증하는 데 사용한 몇 가지 단위 테스트입니다.

using System.Collections.Specialized;
using System.Web;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UtilTests
{
    [TestClass]
    public class IPTests
    {
        [TestMethod]
        public void TestForwardedObfuscated()
        {
            var request = new HttpRequestMock("for=\"_gazonk\"");
            Assert.AreEqual("_gazonk", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedIPv6()
        {
            var request = new HttpRequestMock("For=\"[2001:db8:cafe::17]:4711\"");
            Assert.AreEqual("2001:db8:cafe::17", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedIPv4()
        {
            var request = new HttpRequestMock("for=192.0.2.60;proto=http;by=203.0.113.43");
            Assert.AreEqual("192.0.2.60", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedIPv4WithPort()
        {
            var request = new HttpRequestMock("for=192.0.2.60:443;proto=http;by=203.0.113.43");
            Assert.AreEqual("192.0.2.60", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedMultiple()
        {
            var request = new HttpRequestMock("for=192.0.2.43, for=198.51.100.17");
            Assert.AreEqual("192.0.2.43", Util.IP.GetIPAddress(request));
        }
    }

    public class HttpRequestMock : HttpRequestBase
    {
        private NameValueCollection headers = new NameValueCollection();

        public HttpRequestMock(string forwarded)
        {
            headers["Forwarded"] = forwarded;
        }

        public override NameValueCollection Headers
        {
            get { return this.headers; }
        }
    }
}

9

CloudFlare를 사용중인 경우이 확장 방법을 사용해 볼 수 있습니다 .

public static class IPhelper
{
    public static string GetIPAddress(this HttpRequest Request)
    {
        if (Request.Headers["CF-CONNECTING-IP"] != null) return Request.Headers["CF-CONNECTING-IP"].ToString();

        if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) return Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();

        return Request.UserHostAddress;
    }
}

그때

string IPAddress = Request.GetIPAddress();

그리고 F5 또는 Palo Alto?
Kiquenet

8
string IP = HttpContext.Current.Request.Params["HTTP_CLIENT_IP"] ?? HttpContext.Current.Request.UserHostAddress;

7

할 수있는 일은 사용자의 라우터 IP와 전달 된 IP를 저장하고 IP [외부 공개 및 내부 개인]를 모두 사용하여 신뢰할 수있게 만드는 것입니다. 그러나 며칠 후에 클라이언트는 라우터에서 새로운 내부 IP를 할당받을 수 있지만 더 안정적입니다.


5

@Tony@mangokun 의 답변을 결합하여 다음 확장 방법을 만들었습니다.

public static class RequestExtensions
{
    public static string GetIPAddress(this HttpRequest Request)
    {
        if (Request.Headers["CF-CONNECTING-IP"] != null) return Request.Headers["CF-CONNECTING-IP"].ToString();

        if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
        {
            string ipAddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

            if (!string.IsNullOrEmpty(ipAddress))
            {
                string[] addresses = ipAddress.Split(',');
                if (addresses.Length != 0)
                {
                    return addresses[0];
                }
            }
        }

        return Request.UserHostAddress;
    }
}

왜 사용 HTTP_X_FORWARDED_FOR하지만 사용 하지 X_FORWARDED_FOR않습니까? 그들은 같은가요?
Igor Yalovoy

3

ashx 파일에서 사용

public string getIP(HttpContext c)
{
    string ips = c.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    if (!string.IsNullOrEmpty(ips))
    {
        return ips.Split(',')[0];
    }
    return c.Request.ServerVariables["REMOTE_ADDR"];
}

2
public static class Utility
{
    public static string GetClientIP(this System.Web.UI.Page page)
    {
        string _ipList = page.Request.Headers["CF-CONNECTING-IP"].ToString();
        if (!string.IsNullOrWhiteSpace(_ipList))
        {
            return _ipList.Split(',')[0].Trim();
        }
        else
        {
            _ipList = page.Request.ServerVariables["HTTP_X_CLUSTER_CLIENT_IP"];
            if (!string.IsNullOrWhiteSpace(_ipList))
            {
                return _ipList.Split(',')[0].Trim();
            }
            else
            {
                _ipList = page.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
                if (!string.IsNullOrWhiteSpace(_ipList))
                {
                    return _ipList.Split(',')[0].Trim();
                }
                else
                {
                    return page.Request.ServerVariables["REMOTE_ADDR"].ToString().Trim();
                }
            }
        }
    }
}

사용하다;

string _ip = this.GetClientIP();

0

쉬운 방법입니다.

var remoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress;

그냥 :))


1
참고로, 위의 코드는 Asp.Net Core에서만 작동하며 일반 Asp.Net 링크
Dobin

-1

안녕하세요 여러분 여러분이 찾을 수있는 대부분의 코드는 클라이언트 IP 주소가 아닌 서버 IP 주소를 반환합니다. 그러나이 코드는 올바른 클라이언트 IP 주소를 반환합니다. 자세한 내용은 이것을 확인하십시오.

https://www.youtube.com/watch?v=Nkf37DsxYjI

자바 스크립트를 사용하여 로컬 IP 주소를 얻으려면이 코드를 스크립트 태그 안에 넣을 수 있습니다

<script>
    var RTCPeerConnection = /*window.RTCPeerConnection ||*/
     window.webkitRTCPeerConnection || window.mozRTCPeerConnection;

         if (RTCPeerConnection) (function () {
             var rtc = new RTCPeerConnection({ iceServers: [] });
             if (1 || window.mozRTCPeerConnection) {      
                 rtc.createDataChannel('', { reliable: false });
             };

             rtc.onicecandidate = function (evt) {

                 if (evt.candidate)
                     grepSDP("a=" + evt.candidate.candidate);
             };
             rtc.createOffer(function (offerDesc) {
                 grepSDP(offerDesc.sdp);
                 rtc.setLocalDescription(offerDesc);
             }, function (e) { console.warn("offer failed", e); });


             var addrs = Object.create(null);
             addrs["0.0.0.0"] = false;
             function updateDisplay(newAddr) {
                 if (newAddr in addrs) return;
                 else addrs[newAddr] = true;
                 var displayAddrs = Object.keys(addrs).filter(function
(k) { return addrs[k]; });
                 document.getElementById('list').textContent =
displayAddrs.join(" or perhaps ") || "n/a";
             }

             function grepSDP(sdp) {
                 var hosts = [];
                 sdp.split('\r\n').forEach(function (line) { 
                     if (~line.indexOf("a=candidate")) {   
                         var parts = line.split(' '),   
                             addr = parts[4],
                             type = parts[7];
                         if (type === 'host') updateDisplay(addr);
                     } else if (~line.indexOf("c=")) {      
                         var parts = line.split(' '),
                             addr = parts[2];
                         updateDisplay(addr);
                     }
                 });
             }
         })(); else
         {
             document.getElementById('list').innerHTML = "<code>ifconfig| grep inet | grep -v inet6 | cut -d\" \" -f2 | tail -n1</code>";
             document.getElementById('list').nextSibling.textContent = "In Chrome and Firefox your IP should display automatically, by the power of WebRTCskull.";

         }




</script>
<body>
<div id="list"></div>
</body>

공개 IP 주소를 얻으려면이 코드를 스크립트 태그 안에 넣을 수 있습니다

  function getIP(json) {
    document.write("My public IP address is: ", json.ip);
  }


<script type="application/javascript" src="https://api.ipify.org?format=jsonp&callback=getIP"></script>


-7

시험:

using System.Net;

public static string GetIpAddress()  // Get IP Address
{
    string ip = "";     
    IPHostEntry ipEntry = Dns.GetHostEntry(GetCompCode());
    IPAddress[] addr = ipEntry.AddressList;
    ip = addr[2].ToString();
    return ip;
}
public static string GetCompCode()  // Get Computer Name
{   
    string strHostName = "";
    strHostName = Dns.GetHostName();
    return strHostName;
}

이것은 서버의 IP 주소를 반환합니다
Sreekumar P

웹 애플리케이션 인 asp.net은 사용자 컴퓨터가 아닌 서버에서 실행됩니다.
doekman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.