我有一台可能位于多个防火墙后面的计算机,只有一个私有 IP……几乎无法从外部世界访问。
该计算机定期将 UDP 数据发送到远程服务器(可从任何地方访问)。该远程服务器可能与 UDP 发送方/客户端位于不同的网络中(或与该问题不同的国家/地区)。
在某个时刻,我必须发送一个包,确认我收到了一些数据,返回给“无法访问”的计算机,这意味着:客户端开始了通信并且我确实有一个套接字。
我害怕答案,因为我读到的 UDP 协议主要是send-->disconnect-->forget about the package,但问题来了。有什么方法可以使用现有的 UDP 套接字发送数据?
作为服务器,我使用了一个非常简单的 SocketServer 类:
class MyUDPHandler(SocketServer.BaseRequestHandler):
def handle(self):
message_type = message_utils.extract_type(self.request[0])
message_cls = message_factory.get_class_by_message_type(message_type)
message = message_cls(
data=self.request[0],
came_from=self.client_address)
print "Got %s" % message
message.process()
self.request[1].send("test")
if __name__ == "__main__":
SERVER_HOST = settings.SERVER_HOST\
if hasattr(settings, "SERVER_HOST") else ""
SERVER_PORT = int(settings.SERVER_PORT)
server = SocketServer.UDPServer(
(SERVER_HOST, SERVER_PORT),
MyUDPHandler)
server.serve_forever()
该行self.request[1].send("test")
因错误而失败:[Errno 89] Destination address required
我阅读的越多,我就越认为我无法将数据发送回客户端,至少不能使用这个简单的“ send
”解决方案。
我无法更改客户端。有没有办法重用套接字发送 UDP 数据?也许那里有一个我不知道的“救世主”课程?任何提示将不胜感激。
先感谢您。