Не показывается ip и порт при запуске p2p мессенджера
Сделал простой p2p мессенджер, который требует ввода ip и порта собеседника, для того чтобы переписываться, однако у моего друга вместо ip и порта None:None и мы не знаем почему, помогите пожалуйста
Вот как выглядит программа у меня

Вот как она выглядит у моего друга
Пример кода
import stun
import socket
import threading
source_ip = "0.0.0.0"
source_port = 8547
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((source_ip, source_port))
# nat_type, nat = stun.get_nat_type(sock, source_ip, source_port)
nat_type, nat = stun.get_nat_type(sock,
source_ip, source_port,
stun_host='stun.l.google.com', stun_port=19302 )
external_ip = nat['ExternalIP']
external_port = nat['ExternalPort']
print("Мой адрес: %s:%s" % (external_ip,external_port))
def read_chat(sock):
while True:
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
print('\r', addr,"<", data.decode())
reader = threading.Thread(target=read_chat,args=(sock,))
reader.start()
remote_ip, remote_port = input(
"Введите `адрес:порт` другого компьютера >"
).split(':')
remote_port = int(remote_port)
remote = remote_ip, remote_port
while True:
line = input(">")
if line == '/exit':
break
sock.sendto(line.encode(), remote)
Ответы (1 шт):
Автор решения: GrAnd
→ Ссылка
Ну вот такую инфу возвращает сервер что вы явно указали в коде. Не хочет он отдавать IP.
D:\Programming\Python\1>pystun3 -d -H stun.l.google.com -P 19302
DEBUG:pystun3:Do Test1
DEBUG:pystun3:sendto: ('stun.l.google.com', 19302)
DEBUG:pystun3:recvfrom: ('64.233.163.127', 19302)
DEBUG:pystun3:Result: {'Resp': True, 'ExternalIP': None, 'ExternalPort': None, 'SourceIP': None, 'SourcePort': None, 'ChangedIP': None, 'ChangedPort': None}
DEBUG:pystun3:Do Test2
DEBUG:pystun3:sendto: ('stun.l.google.com', 19302)
DEBUG:pystun3:recvfrom: ('64.233.163.127', 19302)
DEBUG:pystun3:Result: {'Resp': True, 'ExternalIP': None, 'ExternalPort': None, 'SourceIP': None, 'SourcePort': None, 'ChangedIP': None, 'ChangedPort': None}
NAT Type: Full Cone
External IP: None
External Port: None
Press any key to continue
А сервер по-умолчанию вполне себе даёт адекватный ответ.
D:\Programming\Python\1>pystun3 -d
DEBUG:pystun3:Do Test1
DEBUG:pystun3:Trying STUN host: stun.ekiga.net
DEBUG:pystun3:sendto: ('stun.ekiga.net', 3478)
DEBUG:pystun3:recvfrom: ('216.93.246.18', 3478)
DEBUG:pystun3:Result: {'Resp': True, 'ExternalIP': '187.132.171.39', 'ExternalPort': 51347, 'SourceIP': '216.93.246.18', 'SourcePort': 3478, 'ChangedIP': '216.93.246.17', 'ChangedPort':3479}
DEBUG:pystun3:Do Test2
DEBUG:pystun3:sendto: ('stun.ekiga.net', 3478)
DEBUG:pystun3:sendto: ('stun.ekiga.net', 3478)
DEBUG:pystun3:sendto: ('stun.ekiga.net', 3478)
DEBUG:pystun3:sendto: ('stun.ekiga.net', 3478)
DEBUG:pystun3:Result: {'Resp': False, 'ExternalIP': None, 'ExternalPort': None, 'SourceIP': None, 'SourcePort': None, 'ChangedIP': None, 'ChangedPort': None}
DEBUG:pystun3:Do Test1
DEBUG:pystun3:sendto: ('216.93.246.17', 3479)
DEBUG:pystun3:recvfrom: ('216.93.246.17', 3479)
DEBUG:pystun3:Result: {'Resp': True, 'ExternalIP': '187.132.171.39', 'ExternalPort': 51347, 'SourceIP': '216.93.246.17', 'SourcePort': 3479, 'ChangedIP': '216.93.246.18', 'ChangedPort':3478}
DEBUG:pystun3:Do Test3
DEBUG:pystun3:sendto: ('216.93.246.17', 3478)
DEBUG:pystun3:recvfrom: ('216.93.246.17', 3479)
DEBUG:pystun3:Result: {'Resp': True, 'ExternalIP': '187.132.171.39', 'ExternalPort': 51347, 'SourceIP': '216.93.246.17', 'SourcePort': 3478, 'ChangedIP': '216.93.246.18', 'ChangedPort':3478}
NAT Type: Restric NAT
External IP: 187.132.171.39
External Port: 51347
Press any key to continue
Можно попробовать поперебирать разные сервера пока кто-нибудь из них не вернёт нормальный ответ.
import stun
stun_servers = [
'stun01.sipphone.com',
'216.93.246.17:3479',
'stun.fwdnet.net',
'stun.ideasip.com',
'stun.iptel.org',
'stun.rixtelecom.se',
'stun.schlund.de',
'stun.l.google.com:19302',
'stun1.l.google.com:19302',
'stun2.l.google.com:19302',
'stun3.l.google.com:19302',
'stun4.l.google.com:19302',
'stunserver.org',
'stun.softjoys.com',
'stun.voiparound.com',
'stun.voipbuster.com',
'stun.voipstunt.com',
'stun.voxgratia.org',
'stun.xten.com',
]
for stun_srv in stun_servers:
stun_host, stun_port = stun_srv.split(':') if ':' in stun_srv else (stun_srv, 3478)
nat_type, external_ip, external_port = stun.get_ip_info(stun_host=stun_host, stun_port=int(stun_port))
print(f"{stun_host}:{stun_port} => Мой адрес: {external_ip}:{external_port}")
if (external_ip, external_port) != (None, None):
break
Но, честно говоря, что-то далеко не каждый смог определить мой IP.
stun01.sipphone.com:3478 => Мой адрес: None:None
216.93.246.17:3479 => Мой адрес: 187.132.171.39:51347
stun.fwdnet.net:3478 => Мой адрес: None:None
stun.ideasip.com:3478 => Мой адрес: None:None
stun.iptel.org:3478 => Мой адрес: None:None
stun.rixtelecom.se:3478 => Мой адрес: None:None
stun.schlund.de:3478 => Мой адрес: 187.132.171.39:51347
stun.l.google.com:19302 => Мой адрес: None:None
stun1.l.google.com:19302 => Мой адрес: None:None
stun2.l.google.com:19302 => Мой адрес: None:None
stun3.l.google.com:19302 => Мой адрес: 187.132.171.39:51347
stun4.l.google.com:19302 => Мой адрес: None:None
stunserver.org:3478 => Мой адрес: None:None
stun.softjoys.com:3478 => Мой адрес: None:None
stun.voiparound.com:3478 => Мой адрес: None:None
stun.voipbuster.com:3478 => Мой адрес: 187.132.171.39:51347
stun.voipstunt.com:3478 => Мой адрес: 187.132.171.39:51347
stun.voxgratia.org:3478 => Мой адрес: None:None
stun.xten.com:3478 => Мой адрес: 187.132.171.39:51347
