2014-02-13 52 views
0

服務器擁有公共IP,客戶端位於NAT後面。服務器如何通過q​​t將udp發送數據到nat後面的客戶端?

客戶端如何通過q​​d與udp進行通信?

客戶端會先發送一些數據給服務器,然後服務器怎麼回覆客戶端?

當前的代碼是這樣的:

服務器:

self.udpSocketGet = QtNetwork.QUdpSocket() 
self.udpSocketGet.bind(QtNetwork.QHostAddress.LocalHost, serverPort) 
self.udpSocketGet.readyRead.connect(self.receive) 

def receive(self): 
    while self.udpSocketGet.hasPendingDatagrams(): 
     size = self.udpSocketGet.pendingDatagramSize() 
     if size > 0: 
      data, senderAddr, senderPort = self.udpSocketGet.readDatagram(size) 

客戶端:

def sentToServer(self,data): 
    udpSocketSend = QtNetwork.QUdpSocket() 
    udpSocketSend.writeDatagram(data.encode('utf-8'), serverAddress, serverPort) 

回答

5

的回答你的問題超出了QT。退房http://en.m.wikipedia.org/wiki/UDP_hole_punchinghttp://en.m.wikipedia.org/wiki/NAT_traversal

我正在編輯此答案後,我回頭看,發現該服務器有一個公共IP地址。在這種情況下,服務器將只需響應請求來自的任何IP地址。如果客戶端通過NAT進行通信,服務器將看到路由器的公共地址,並且完全不知道實際客戶端在該路由器後面。

閱讀Receiving a response through UDP 底線是你必須使用端口映射或UPNP。

另請參見https://superuser.com/questions/456812/nat-and-udp-replies 此外,服務器代碼不應該與NAT遍歷有關。客戶端使用UPNP並且路由器啓用了UPNP。或者將路由器配置爲端口轉發或記住源自客戶端的數據包的源IP地址和目的IP地址以及端口,並正確回退服務器發送的數據包。

+0

我讀過一些基本理論,這個問題比udp hole punching要容易很多,我知道server可以發送數據給** senderAddr:senderPort **,唯一的問題是客戶端怎麼可能接收到數據,哪個端口應該客戶端綁定? – Hunger

相關問題