[英]UDP Hole Punching Not Working
我正在嘗試創建一個聊天程序,該程序可以通過UDP打孔並直接連接到代理提供的節點來工作。
我現在擁有的腳本在本地可以正常運行。 當我嘗試使用外部地址進行連接時,問題就來了。 我無法自己解決這個問題,所以我希望這里有人可以幫助我!
import socket
import json
import landerdb
import threading
class PeerChat:
address = None
def __init__(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.db = landerdb.Connect("nodes")
self.brok_ip = ""
self.brok_port = 5000
self.nick = "Test"
self.friends = []
def listen(self):
self.command = {
"HERE":self.here,
"MSG":self.msg,
}
global address
self.sock.bind(address)
while True:
msg, addr = self.sock.recvfrom(1024)
try:
data = json.loads(msg)
except:
continue
if data[u'cmd'] in self.command:
threading.Thread(target=self.command[data[u'cmd']], args=(addr, data)).start()
def main(self):
while True:
msg = raw_input("> ")
msg = msg.split()
try:
msg = json.dumps({"cmd":msg[0], "data":' '.join(msg[2:]), "nick":self.nick, "to":msg[1]})
except:
continue
for x in self.db.find("nodes", "all"):
self.sock.sendto(msg, tuple(x['addr']))
def here(self, addr, data):
if not self.db.find("nodes", {"addr":addr}):
self.db.insert("nodes", {"addr":addr})
if data['nick'] in self.friends:
print data['nick'] + " has come online."
def msg(self, addr, data):
if data['to'] == self.nick:
print data['nick']+": "+data['data']
def GetNodes(self):
self.sock.sendto("", (self.brok_ip, self.brok_port))
with open("nodes", 'wb') as file:
while True:
msg, addr = self.sock.recvfrom(1024)
if msg == "\n":
break
file.write(msg)
msg, addr = self.sock.recvfrom(1024)
global address
address = ("0.0.0.0", int(msg))
for x in self.db.find("nodes", "all"):
addr = tuple(x['addr'])
self.sock.sendto(json.dumps({"cmd":"HERE", "nick":self.nick}),addr)
if __name__ == "__main__":
PeerChat().GetNodes()
threading.Thread(target=PeerChat().listen).start()
PeerChat().main()
我尚未在外部測試此代碼,因為我在uni上學習,但是我使用略有不同的行來設置UDP連接。
他們可能會給您一些想法...
#!/usr/bin/python
import socket
import struct
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('239.255.60.60', 4876))
mreq = struct.pack("=4sl", socket.inet_aton("239.255.60.60"), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
packet_number = 0
while True:
packet_number += 1
print packet_number
raw_data = sock.recv(1024)
print raw_data
print
我不完全了解所有內容,但是對我有用。 它是從這里改編的。 您應該閱讀整個頁面幾次,以了解他們在說什么。 在頁面上搜索“ IP_MULTICAST_TTL”,我收集到您需要設置socket.IP_MULTICAST_TTL, 33
在sock.setsockopt中為socket.IP_MULTICAST_TTL, 33
,該數字為任何大於32的數字。請記住,在這個階段,我幾乎和您一樣不確定。 ..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.