服务器具有公共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)
答案 0 :(得分:5)
你的问题的答案超越了qt。查看http://en.m.wikipedia.org/wiki/UDP_hole_punching和http://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地址和端口,并正确地远程返回服务器发送的数据包。