簡體   English   中英

UDP Socketserver-通過同一套接字發送數據(不可能嗎?)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM