我有一个使用python-twisted(http://pastebin.com/X7UYYLWJ)编写的客户端,它使用libuv将UDP数据包发送到用C语言编写的UDP服务器。当客户端向服务器发送数据包时,服务器会成功接收该数据包,并将响应发送回python客户端。但是客户没有收到任何回复,可能是什么原因?
答案 0 :(得分:2)
不幸的是,有很多可能性。
您的代码使用connect
来设置“连接的UDP”套接字。连接的UDP套接字过滤它们收到的数据包。如果从除套接字所连接的地址以外的任何地址接收数据包,则丢弃它们。可能是服务器从与您连接的地址不同的地址发送其响应(可能它使用另一个端口,或者它可能是多宿主并使用不同的IP)。
另一种可能性是NAT设备阻止返回数据包。 UDP NAT打孔已经走了很长的路,但它仍然不完美。可能是服务器的响应到达NAT设备并被丢弃或错误路由。
与此相关的是故意配置的防火墙阻止返回数据包的可能性。
另一种可能性是数据包丢失了。 UDP不是可靠的协议。拥塞的路由器,故障网络设备或各种其他深奥(通常是瞬态)问题可能会导致数据包在某个时刻丢失,而不是转发到下一跳。
调试此操作的第一步应该是尽可能使您的应用程序尽可能宽松。摆脱使用连接的UDP,以便将进入您的进程的所有数据包传递到您的应用程序代码。
如果这没有帮助,请使用tcpdump或wireshark或类似工具来确定数据包是否完全转到您的计算机。如果他们这样做但您的应用程序没有看到它们,请查找可能拒绝它们的本地防火墙配置。
如果他们没有将其发送到您的计算机,请查看他们是否将其发送到您的路由器。使用路由器上可用的任何诊断工具(沿着tcpdump行)查看数据包是否成功。或者如果没有这样的工具,请从等式中删除路由器。如果您看到数据包发送到您的路由器但没有进一步,请在那里查找防火墙或NAT配置问题。
如果数据包没有达到您的路由器,请移至您有权访问的下一跳。这是事情可能变得困难的地方,因为您可能无法访问下一跳或下一跳可能是服务器(有许多介入的跳跃 - 您必须希望它们都在工作)。
服务器是否实际生成了回复?该回复的地址信息是什么?它符合客户的期望吗?由于拥塞或防火墙,它是否会被丢弃在服务器的出接口上?
希望你能在其中一个步骤中发现一些有趣的东西,并能够解决问题。
答案 1 :(得分:1)
我有类似的问题。问题是Windows防火墙。在防火墙允许的程序设置中,允许pythonw / python的通信确实解决了这个问题。我的python程序是:
from socket import *
import time
address = ( '192.168.1.104', 42) #Defind who you are talking to (must match arduino IP and port)
client_socket = socket(AF_INET, SOCK_DGRAM) #Set Up the Socket
client_socket.bind(('', 45)) # arduino sending to port 45
client_socket.settimeout(1) #only wait 1 second for a response
data = "xyz"
client_socket.sendto(data, address)
try:
rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
print rec_data #Print the response from Arduino
except:
pass
while(1):
pass