gpt4 book ai didi

python - UDP 打洞不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 18:58:36 25 4
gpt4 key购买 nike

我正在尝试创建一个聊天程序,该程序通过 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()

最佳答案

我还没有在外部测试过这段代码,因为我在大学,但我使用稍微不同的线路来设置 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

我并不完全理解这一切,但它对我有用。改编自here 。您应该阅读整个页面几次以了解他们在说什么。搜索“IP_MULTICAST_TTL”页面,我发现您需要在 sock.setsockopt 中设置 socket.IP_MULTICAST_TTL, 33,其中数字是大于 32 的任何数字。请记住,我几乎同样不确定正如您现阶段...

关于python - UDP 打洞不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16640846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com