ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python UDP数据包永远不会到达

2019-11-22 02:09:25  阅读:292  来源: 互联网

标签:networking udp packets python


在过去的几天里,我试图弄清楚如何通过UDP来回发送数据(我有一个简单的多人游戏计划).到目前为止,一切都很好,直到我意识到它只能在LAN上正常工作,但没有任何数据包通过Internet到达.如果我在一台计算机上运行测试服务器和测试脚本(下面的代码),并通过LAN发送数据,它就可以正常运行(通过Internet发送时,Wireshark发出“端口无法访问”错误).当客户端和服务器位于不同的计算机上时,我可以通过Internet和LAN发送数据,而目的地则什么也没有到达.我花了几个小时进行谷歌搜索,确保转发了端口,摆弄了设置,对代码进行了两次和三次检查,使用Wireshark检查,与其他人进行了测试,什么都没有.

我究竟做错了什么?

这是我的测试代码:

import socket, pickle
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sock.setblocking(0)
port = 5000

type = raw_input("1=Server 2=Client 3=Local Client: ")

if type == "1":
  ip = ""
  sock.bind((ip,port))
  print("Socket: "+str(sock.getsockname()))
  while True:
    try:
      rdata, addr = sock.recvfrom(1024)
      data = pickle.loads(rdata)
      print addr, ">>>", data
    except:
      pass

elif type == "2":
  ip = "79.222.132.25"
  sock.bind(("192.168.2.102",port+1))
  sock.connect((ip,port))
  print("Socket: "+str(sock.getsockname()))
  print("Connected to: "+str(sock.getpeername()))
  while True:
    input = raw_input("Send:")
    data = pickle.dumps((input))
    sock.send(data)

else:
  ip = "192.168.2.102"
  sock.bind((ip,port+1))
  while True:
    input = raw_input("Send:")
    data = pickle.dumps((input))
    sock.sendto(data,(ip,port))

预先感谢您的帮助.

解决方法:

我只是通过Internet运行了您的代码,并且工作正常.我使用类型1和2进行测试.
首先,我建议您删除客户端中的线绑定端口.像这样:

elif type == "2":
ip = "79.222.132.25"
# sock.bind(("192.168.2.102",port+1))
sock.connect((ip,port))
print("Socket: "+str(sock.getsockname()))
print("Connected to: "+str(sock.getpeername()))
while True:
    input = raw_input("Send:")
    data = pickle.dumps((input))
    sock.send(data)

因为通常客户端不需要显式绑定端口-调用sock.connect()时,系统会自动为您的套接字分配一个随机端口.

然后让我们解决您的问题.
您的代码是正确的,因此Internet一定有问题,更有可能是服务器.
如果服务器在NAT网关或路由器下工作,则网关将拒绝任何传入连接.测试服务器状态的一种简单方法是在命令行提示符下键入ipconfig(或Linux中的ifconfig),以检查本地IP地址是否为公共Internet地址.可以从以下网站检索公共Internet地址:whatismyipaddress.com.

这是您可能遇到的最可能的问题.
使服务器的网络环境正确的最简单方法是找到一台具有静态公共IP且没有任何NAT网关的真实服务器.或者只是租用VPS来测试您的代码.

谢谢.

标签:networking,udp,packets,python
来源: https://codeday.me/bug/20191122/2056310.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有