提问:P2P连接中双方都是端口限制,为什么有些打洞不成功?


如上图所示,我写了个P2P的客户端,他们俩个互相打洞成功,但这个网络环境是在S是外网 C1,C2 是在同一个局域网的情况下打通的,证明了程序代码没问题,然后我在手机客户端选择了数据流量再次进行打洞却没有打通,然后我去检测了流量的NAT类型,确定了双方都是NAT3类型,但却没有打通这个涉及到了我的知识盲区,不知道是因为什么因素导致的P2P未打通。
希望得到指教!


如上图所示,我写了个P2P的客户端,他们俩个互相打洞成功,但这个网络环境是在S是外网 C1,C2 是在同一个局域网的情况下打通的,证明了程序代码没问题,然后我在手机客户端选择了数据流量再次进行打洞却没有打通,然后我去检测了流量的NAT类型,确定了双方都是NAT3类型,但却没有打通这个涉及到了我的知识盲区,不知道是因为什么因素导致的P2P未打通。
希望得到指教!
关注让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek
如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞
import socket
def get_nat_type():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
local_ip = s.getsockname()[0]
s.close()
# 这里只是简单示意,后续需要根据具体的网络探测技术来确定NAT类型
if local_ip.startswith('10.') or local_ip.startswith('172.') or local_ip.startswith('192.168.'):
return "可能是局域网内的NAT类型,具体需进一步探测"
else:
# 假设向一个外部服务器发送不同源端口的UDP包,根据响应来推测NAT类型
# 这只是个简单示例,实际需要更复杂的逻辑和多个探测步骤
sock = socket.socket(socket.AF_INET, socket.SOCK_DUDP)
sock.sendto(b'test', ('8.8.8.8', 80))
response = sock.recvfrom(1024)
sock.close()
if response:
# 根据具体的响应情况判断NAT类型
if '某种特定响应特征' in response:
return "Full Cone NAT"
elif '另一种响应特征' in response:
return "Restricted Cone NAT"
elif '再一种响应特征' in response:
return "Port Restricted Cone NAT"
elif '特定的对称NAT响应特征' in response:
return "Symmetric NAT"
return "无法确定NAT类型"
except socket.error as e:
return f"获取NAT类型失败: {e}"
import subprocess
def check_firewall_rules():
try:
# 假设在Linux系统下
result = subprocess.run(['iptables', '-L'], capture_output=True, text=True)
return result.stdout
except subprocess.CalledProcessError as e:
return f"检查防火墙规则失败: {e}"
import socket
import time
def udp_hole_punching(client_socket, target_ip, target_port, max_retries=3, retry_delay=1):
for i in range(max_retries):
try:
client_socket.sendto(b'hole_punching', (target_ip, target_port))
data, addr = client_socket.recvfrom(1024)
if data:
print(f"打洞成功,收到响应: {data}")
return True
except socket.timeout:
print(f"第{i + 1}次打洞请求超时,重试...")
time.sleep(retry_delay)
print("打洞失败,达到最大重试次数")
return False
希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。