簡體   English   中英

服務器如何在Qt中通過udp將數據發送到nat后面的客戶端?

[英]how could a server send data to a client behind nat by udp in qt?

服務器具有公共IP,客戶端位於nat后面。

客戶端如何通過Qt中的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)

您問題的答案超出了qt。 查看http://en.m.wikipedia.org/wiki/UDP_hole_punchinghttp://en.m.wikipedia.org/wiki/NAT_traversal

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

閱讀通過UDP接收響應底線是您必須使用端口映射或UPNP。

另請參見https://superuser.com/questions/456812/nat-and-udp-replies同樣,服務器代碼不應與NAT遍歷有關。 客戶端使用UPNP,或者路由器啟用UPNP。 或者將路由器配置為端口轉發或記住源於客戶端的數據包的源IP地址和目標IP地址以及端口,並正確地向后轉發服務器發送的數據包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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