服务器有一个公共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 地址以及端口,并正确转发服务器发送的数据包。
您不需要UDP打洞,只需向服务器发送一个虚拟负载,因为数据包具有源ip和端口,服务器会计算出正确的端口。只需写回任何内容即可返回到您创建的 udpcon