[英]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_punching和http://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.