2010-04-13 3 views
2

방문자의 IP를 표시하는 페이지를 설정하려고합니다. 내가 시도한 모든 방법은 내 컴퓨터의 IP와 다른 IP를 보여줍니다. 나는 시도했다 :파이썬은 내가 다른 IP라고 생각합니다.

  1. [0] [4] [0]

방법까지 http://www.whatismyip.com/automation/n09230945.asp

  • 찾고 (,) (socket.gethostname 없음) socket.getaddrinfo 사용하지 방문자의 실제 IP를 찾을 수 있습니까? 실제로 파이썬 인터프리터이 실행되고있는 서버의 주소 얻고있는 낮은 수준의 네트워킹 인터페이스를 사용하여

  • +0

    당신은 filewall 또는 NAT 라우터 뒤에 있습니까? 파이썬이 192.168 .... 또는 10.10 ....과 같은 것을 말하고 있습니까? 외부 IP 주소를 알고 싶습니까? –

    +0

    whatismyip에 따르면 내 IP는 128.2.xxx.xxx입니다. 파이썬에 따르면, 내 IP는 72.47.xxx입니다.xxx – Yongho

    +0

    파이썬 서버는 어디에 있습니까? 로컬 네트워크 또는 인터넷에 있습니까? tracert 또는 traceroute와 같은 도구를 사용하면 모르는 경우 서버 위치를 확인할 수 있습니다. – vfilby

    답변

    0

    나는 간단한 해결책을 발견 : 여기

    가 클라이언트의 IP를 결정 보여주는 작은 C#을 조각이다, 논리는 파이썬 서버 헤더가 동일한 변환하기 쉽습니다

    이렇게하면 서버에 연결하는 컴퓨터의 IP 주소가 반환됩니다.

    +1

    위의 대답에서 언급했듯이이 헤더를 사용할 수는 있지만 프록시는 고려하지 않습니다. 내 대답에 더 많은 정보 – vfilby

    4

    :

    "socket.gethostname을() : 시스템의 호스트 이름을 포함하는 문자열을 반환 곳 파이썬 인터프리터는 현재 실행된다. 연결을 수락) (socket.accept "

    는 낮은 수준의 네트워크 인터페이스를

    를 사용하여 클라이언트의 IP 얻기". 소켓을 주소에 바인딩되고 연결을 청취해야합니다. 반환 값은 쌍 (conn, address)입니다. 여기서 conn은 연결에서 데이터를 보내고받을 수있는 새 소켓 객체이고 address는 연결의 다른 끝에있는 소켓에 바인딩 된 주소입니다. (제공 HTML 경우)

    REMOTE_ADDR은 당신이 먼저 확인해야 클라이언트의 IP 주소를 포함하는 헤더이다 "

    More info on the low level network interface

    # Echo server program 
    import socket 
    
    HOST = ''     # Symbolic name meaning all available interfaces 
    PORT = 50007    # Arbitrary non-privileged port 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind((HOST, PORT)) 
    s.listen(1) 
    conn, addr = s.accept() 
    print 'Connected by', addr 
    while 1: 
        data = conn.recv(1024) 
        if not data: break 
        conn.send(data) 
    conn.close() 
    
    는 HTTP 헤더에서 클라이언트 IP를 얻기.

    방문자가 프록시를 통과 할 경우에 대비하여 HTTP_X_FORWARDED 헤더도 확인해야합니다. t HTTP_X_FORWARDED은 프록시 수에 따라 여러 개의 쉼표로 구분 된 값을 포함 할 수있는 배열입니다.

    또한 NATed (Network Address Translation) 일 수 있습니다. 귀하의 IP가 내부 (10.x.x.x 또는 192.168.x.x)로 NAT 라우터 뒤에 있으며 외부 IP 만 웹 사이트에 노출됩니다.

    import getenv 
    print getenv("REMOTE_ADDR") 
    
    :
    string clientIp = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
    if(!string.IsNullOrEmpty(clientIp)) { 
        string[] forwardedIps = clientIp.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
        clientIp = forwardedIps[forwardedIps.Length - 1]; 
    } else { 
        clientIp = context.Request.ServerVariables["REMOTE_ADDR"]; 
    }