[英]UDP Socketserver - send data through same socket (impossible?)
我有一台可能位於多個防火牆后面的計算機,只有一個專用IP ...幾乎無法從外部訪問。
該計算機會定期將UDP數據發送到遠程服務器(可從任何地方訪問)。 該遠程服務器可能與UDP發送方/客戶端位於不同的網絡中(或與此不同的國家/地區)。
在某個時候,我必須發送一個程序包,確認我已收到一些數據回“不可達”的計算機,這意味着:客戶端開始通信,並且我確實有一個套接字。
我很害怕這個答案,因為我讀到的UDP協議主要是發送->斷開連接->忘記軟件包 ,但這是問題所在。 是否可以使用現有的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數據嗎? 也許有一個我不知道的“救世主”課程? 任何提示將不勝感激。
先感謝您。
您必須使用.sendto()
而不是.send()
,如下所示:
self.request[1].sendto(
"test",
self.client_address)
參考: http : //docs.python.org/2/library/socketserver.html#socketserver-udpserver-example
比我可以創建的最小的響應UDP套接字服務器:
import SocketServer
class MyUDPHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.request[1].sendto( "test\n", self.client_address)
SocketServer.UDPServer( ("", 5432), MyUDPHandler).serve_forever()
因此可以從Linux命令行進行測試:
$ nc -u 127.1 5432
盡管從客戶端和服務器的角度來看,UDP是無連接的,但是從NAT /路由器的角度來看,仍然存在用於雙向通信的連接。 服務器只需要回復從其接收消息的IP /端口即可到達客戶端。
python文檔提供了一個很好的示例: http : //docs.python.org/2/library/socketserver.html#socketserver-udpserver-example
基本上,它只需要請求地址並使用sendto函數
socket.sendto("test", self.client_address)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.