add IPv6 support

This commit is contained in:
5IGI0
2020-04-08 04:28:26 +02:00
parent db5b816fed
commit 348c46b7a2
3 changed files with 54 additions and 9 deletions

View File

@@ -1,6 +1,7 @@
import socket
import struct
from ..scripts.address_tools import ip_type
class Connection:
def __init__(self):
@@ -160,7 +161,7 @@ class UDPSocketConnection(Connection):
def __init__(self, addr, timeout=3):
Connection.__init__(self)
self.addr = addr
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.socket = socket.socket(socket.AF_INET if ip_type(addr[0]) == 4 else socket.AF_INET6, socket.SOCK_DGRAM)
self.socket.settimeout(timeout)
def flush(self):

View File

@@ -0,0 +1,50 @@
import socket
def ip_type(address):
try:
socket.inet_pton(socket.AF_INET, address)
except AttributeError:
try:
socket.inet_aton(address)
except socket.error:
return False
return 4 if address.count('.') == 3 else None
except socket.error:
try:
socket.inet_pton(socket.AF_INET6, address)
return 6
except socket.error:
return None
return 4
def parse_address(address):
parts = address.split(":")
if len(parts) == 1:
return (address, None)
elif len(parts) == 2:
try:
return (parts[0], int(parts[1]))
except:
raise ValueError("Invalid address '%s'" % address)
elif len(parts) < 10:
tmp = address
port = None
if len(parts[0]) and len(parts[-2]) and "[" == parts[0][0] and "]" == parts[-2][-1] :
if not parts[-1].isdigit():
raise ValueError("Invalid address '%s'" % address)
port = int(parts[-1])
parts[0] = parts[0][1:]
parts[-2] = parts[-2][:-1]
tmp = ':'.join(parts[0:-1])
if not ip_type(tmp) == 6:
raise ValueError("Invalid address '%s'" % address)
else:
return (tmp, port)
parts[0] = parts[0][1:]
parts[-2] = parts[0][:-1]
else:
raise ValueError("Invalid address '%s'" % address)

View File

@@ -1,6 +1,7 @@
from mcstatus.pinger import ServerPinger
from mcstatus.protocol.connection import TCPSocketConnection, UDPSocketConnection
from mcstatus.querier import ServerQuerier
from mcstatus.scripts.address_tools import parse_address
import dns.resolver
@@ -11,14 +12,7 @@ class MinecraftServer:
@staticmethod
def lookup(address):
host = address
port = None
if ":" in address:
parts = address.split(":")
if len(parts) > 2:
raise ValueError("Invalid address '%s'" % address)
host = parts[0]
port = int(parts[1])
host, port = parse_address(address)
if port is None:
port = 25565
try: