문제

Python으로 간단한 서버 응용 프로그램을 작성하려고 노력하고 있으며 IP가 청취 소켓을 바인딩하도록하려고합니다. 내가 본 예는 이것을 사용합니다.

HOST = gethostbyaddr(gethostname())

그 후 약간 더 처리되면 호스트 IP 만 문자열로 제공해야합니다. IPv4 주소를 반환해야합니다. 그러나이 코드를 실행하면 IPv6 주소를 반환합니다. 왜 이런 일을하고 어떻게 IPv4 주소를 얻을 수 있습니까?

관련이 있다면 Windows Vista 및 Python 2.5를 사용하고 있습니다.

도움이 되었습니까?

해결책

IP 주소를 얻는 것은 생각보다 어렵습니다.

확인하다 이 답변 나는 내가 찾은 신뢰할 수있는 방법을 주었다.

당신이 물건을 클릭하는 것을 좋아하지 않는 경우에 대답하는 내용은 다음과 같습니다.

사용 netifaces 기준 치수. 네트워킹은 복잡하기 때문에 Netiface를 사용하는 것은 약간 까다로울 수 있지만 여기에 원하는 작업을 수행하는 방법은 다음과 같습니다.

>>> import netifaces
>>> netifaces.interfaces()
['lo', 'eth0']
>>> netifaces.ifaddresses('eth0')
{17: [{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '00:11:2f:32:63:45'}], 2: [{'broadcast': '10.0.0.255', 'netmask': '255.255.255.0', 'addr': '10.0.0.2'}], 10: [{'netmask': 'ffff:ffff:ffff:ffff::', 'addr': 'fe80::211:2fff:fe32:6345%eth0'}]}
>>> for interface in netifaces.interfaces():
...   print netifaces.ifaddresses(interface)[netifaces.AF_INET]
...
[{'peer': '127.0.0.1', 'netmask': '255.0.0.0', 'addr': '127.0.0.1'}]
[{'broadcast': '10.0.0.255', 'netmask': '255.255.255.0', 'addr': '10.0.0.2'}]
>>> for interface in netifaces.interfaces():
...   for link in netifaces.ifaddresses(interface)[netifaces.AF_INET]:
...     print link['addr']
...
127.0.0.1
10.0.0.2

이것은 다음과 같이 조금 더 읽을 수 있습니다.

from netifaces import interfaces, ifaddresses, AF_INET

def ip4_addresses():
    ip_list = []
    for interface in interfaces():
        for link in ifaddresses(interface)[AF_INET]:
            ip_list.append(link['addr'])
    return ip_list

IPv6 주소를 원하는 경우 사용하십시오 AF_INET6 대신에 AF_INET. 이유가 궁금하다면 netifaces 모든 곳에서 목록과 사전을 사용합니다. 단일 컴퓨터에는 여러 NIC가있을 수 있으며 각 NIC에는 여러 개의 주소가있을 수 있으며 각 주소에는 고유 한 옵션이 있습니다.

다른 팁

IPv6은 새로운 가족이기 때문에 IPv4보다 우선합니다. 호스트 이름이 여러 가족과 관련이있는 경우 일반적으로 원하는 것입니다. 당신은 사용해야합니다 getAddrinfo 가족 독립 결의의 경우 다음은 예입니다.

import sys, socket;
host = socket.gethostname();
result = socket.getaddrinfo(host, None);
print "family:%i socktype:%i proto:%i canonname:%s sockaddr:%s"%result[0];
result = socket.getaddrinfo(host, None, socket.AF_INET);
print "family:%i socktype:%i proto:%i canonname:%s sockaddr:%s"%result[0];
result = socket.getaddrinfo(host, None, socket.AF_INET6);
print "family:%i socktype:%i proto:%i canonname:%s sockaddr:%s"%result[0];

듀얼 스택 구성 호스트에서 다음과 같은 것을 제공합니다.

family:10 socktype:1 proto:6 canonname: sockaddr:('2002:dce8:d28e::31', 0, 0, 0)
family:2 socktype:1 proto:6 canonname: sockaddr:('10.6.28.31', 0)
family:10 socktype:1 proto:6 canonname: sockaddr:('2002:dce8:d28e::31', 0, 0, 0)

gethostbyaddr() IP 주소를 호스트 이름이 아닌 매개 변수로 취하므로 예외를 던지지 않고 전혀 작동하지 않는 것에 놀랐습니다. 대신 당신이 의미한다면 gethostbyname(), 그 기능은 IPv6을 지원하지 않는다고 주장하기 때문에 결과는 더 놀라운 일입니다. 할리의 대답 IP 주소를 올바르게 얻는 방법을 설명합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top