:
"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"];
}
당신은 filewall 또는 NAT 라우터 뒤에 있습니까? 파이썬이 192.168 .... 또는 10.10 ....과 같은 것을 말하고 있습니까? 외부 IP 주소를 알고 싶습니까? –
whatismyip에 따르면 내 IP는 128.2.xxx.xxx입니다. 파이썬에 따르면, 내 IP는 72.47.xxx입니다.xxx – Yongho
파이썬 서버는 어디에 있습니까? 로컬 네트워크 또는 인터넷에 있습니까? tracert 또는 traceroute와 같은 도구를 사용하면 모르는 경우 서버 위치를 확인할 수 있습니다. – vfilby