파이썬 스크립트를 사용하여 UDP 패킷을 서버로 보내 서버에 알림을 수신하도록 스크립트를 등록합니다. 프로토콜을 사용하려면 이러한 IP 주소와 포트를 보내야합니다. 따라서이 주소는 서버의 네트워크에서 연결할 수 있어야합니다.Python : IP 주소를 특정 원격 IP 주소로 보내는 데 사용되는 로컬 IP 주소 가져 오기
솔루션은 Windows XP 이상 및 Mac OS X에서 작동해야합니다. 이는 내 개발 플랫폼이기 때문에.
첫 번째 단계는 내 인터페이스의 IP 주소를 얻는 것입니다. 현재 컴퓨터에서 호스트 이름을 확인하기 위해 일반적으로 제안되는 방법을 사용하고 있습니다.
def get_local_address():
return socket.gethostbyname(socket.gethostname())
이것은 가끔씩 만 작동합니다. 현재 172.16.249.1
을 반환하는데, 이는 VM웨어가 사용하는 가상 인터페이스의 주소이기 때문에 문제가됩니다.
대부분의 경우 가장 적합한 기본 인터페이스의 IP 주소를 얻는 방법이 훨씬 더 좋습니다.
TCP와 같은 연결 지향 프로토콜로 서버에 연결하는 데 사용되는 실제 IP 주소를 얻는 방법이 더 좋을 것입니다. 나는 실제로 그 주소를 얻을 수 있지만 연결을 열려고 시도하지 않고 할 수
def get_address_to_connect_to(server_addr):
non_open_port = 50000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((server_addr, non_open_port))
except socket.error:
pass
else:
s.close() # just in case
return s.getsockname()[0]
일부 TCP 타임 아웃은 서버에 연결할 수 없거나 사이에서 악한 방화벽 ICMP 차단되는 경우에 도달 할 때까지이 차단됩니다 패킷. 그 정보를 얻는 더 좋은 방법이 있습니까?
아, 달콤한 공감! 'SOCK_DGRAM'으로, 거의 완벽 할 것입니다! 그러나''.getsockname()'은 ('0.0.0.0', 51770)'을 반환합니다. 나는's = socket.socket (socket.AF_INET, socket.SOCK_DGRAM);을 시도했다. s.sendto (b'hello ', ('1.2.3.4 ', 50000)); s.getsockname() [0]'. 대답에 코드를 추가하면 좋을 것입니다! – Feuermurmel
답변을 수정하십시오. – DNS
완벽하게 작동합니다. 심지어 내가 모르는 [폐기 프로토콜] (http://en.wikipedia.org/wiki/Discard_Protocol)을 사용합니다! 나는'del s'을'with' 문으로 대체했습니다. – Feuermurmel