Python Twisted 客户端无法从服务器接收响应
Python Twisted client not able to receive response from server
我有一个使用 python-twisted (http://pastebin.com/X7UYYLWJ) 编写的客户端,它使用 libuv 将 UDP 数据包发送到用 C 编写的 UDP 服务器。当客户端向服务器发送数据包时,服务器会成功接收到数据包,并将响应发送回 python 客户端。但是客户端没有收到任何响应,可能是什么原因?
不幸的是,有很多可能性。
您的代码使用 connect
设置 "connected UDP" 套接字。已连接的 UDP 套接字过滤它们接收到的数据包。如果从套接字连接到的地址以外的任何地址接收到数据包,它们将被丢弃。可能是服务器从与您连接到的地址不同的地址发送响应(可能它使用另一个端口,或者它可能是多宿主的并且使用不同的 IP)。
另一种可能性是 NAT 设备正在阻止 return 数据包。 UDP NAT 打洞已经取得了长足的进步,但仍不完美。可能是服务器的响应到达 NAT 设备并被丢弃或错误路由。
与此相关的是有意配置的防火墙阻止 return 数据包的可能性。
另一种可能是数据包丢失了。 UDP 不是可靠的协议。拥塞的路由器、故障的网络设备或各种其他深奥的(通常是暂时的)问题可能会导致数据包在某个时刻被丢弃,而不是转发到下一跳。
调试此问题的第一步应该是使您的应用程序尽可能宽松。不再使用已连接的 UDP,以便所有到达您的进程的数据包都被传送到您的应用程序代码。
如果这没有帮助,请使用 tcpdump 或 wireshark 或类似工具来确定数据包是否完全到达您的计算机。如果他们这样做但您的应用程序没有看到他们,请寻找可能拒绝他们的本地防火墙配置。
如果它们没有连接到您的计算机,请查看它们是否连接到您的路由器。使用路由器上可用的任何诊断工具(沿着 tcpdump 行)来查看数据包是否到达那么远。或者,如果没有此类工具,请从等式中删除路由器。如果您看到数据包到达您的路由器但没有进一步,请在此处查找防火墙或 NAT 配置问题。
如果数据包没有到达您的路由器,请转到您有权访问的下一跳。这是事情可能变得困难的地方,因为您可能无法访问下一跃点,或者下一跃点可能是服务器(有许多中间跃点 - 您只希望它们都在工作)。
服务器真的生成回复了吗?该回复中包含哪些寻址信息?它是否符合客户的期望?它是否由于拥塞或防火墙而在服务器的传出接口处被丢弃?
希望您会在这些步骤之一中发现一些有趣的东西并能够解决问题。
我遇到了类似的问题。问题是 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
我有一个使用 python-twisted (http://pastebin.com/X7UYYLWJ) 编写的客户端,它使用 libuv 将 UDP 数据包发送到用 C 编写的 UDP 服务器。当客户端向服务器发送数据包时,服务器会成功接收到数据包,并将响应发送回 python 客户端。但是客户端没有收到任何响应,可能是什么原因?
不幸的是,有很多可能性。
您的代码使用 connect
设置 "connected UDP" 套接字。已连接的 UDP 套接字过滤它们接收到的数据包。如果从套接字连接到的地址以外的任何地址接收到数据包,它们将被丢弃。可能是服务器从与您连接到的地址不同的地址发送响应(可能它使用另一个端口,或者它可能是多宿主的并且使用不同的 IP)。
另一种可能性是 NAT 设备正在阻止 return 数据包。 UDP NAT 打洞已经取得了长足的进步,但仍不完美。可能是服务器的响应到达 NAT 设备并被丢弃或错误路由。
与此相关的是有意配置的防火墙阻止 return 数据包的可能性。
另一种可能是数据包丢失了。 UDP 不是可靠的协议。拥塞的路由器、故障的网络设备或各种其他深奥的(通常是暂时的)问题可能会导致数据包在某个时刻被丢弃,而不是转发到下一跳。
调试此问题的第一步应该是使您的应用程序尽可能宽松。不再使用已连接的 UDP,以便所有到达您的进程的数据包都被传送到您的应用程序代码。
如果这没有帮助,请使用 tcpdump 或 wireshark 或类似工具来确定数据包是否完全到达您的计算机。如果他们这样做但您的应用程序没有看到他们,请寻找可能拒绝他们的本地防火墙配置。
如果它们没有连接到您的计算机,请查看它们是否连接到您的路由器。使用路由器上可用的任何诊断工具(沿着 tcpdump 行)来查看数据包是否到达那么远。或者,如果没有此类工具,请从等式中删除路由器。如果您看到数据包到达您的路由器但没有进一步,请在此处查找防火墙或 NAT 配置问题。
如果数据包没有到达您的路由器,请转到您有权访问的下一跳。这是事情可能变得困难的地方,因为您可能无法访问下一跃点,或者下一跃点可能是服务器(有许多中间跃点 - 您只希望它们都在工作)。
服务器真的生成回复了吗?该回复中包含哪些寻址信息?它是否符合客户的期望?它是否由于拥塞或防火墙而在服务器的传出接口处被丢弃?
希望您会在这些步骤之一中发现一些有趣的东西并能够解决问题。
我遇到了类似的问题。问题是 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