服务器如何通过q​​t中的udp向nat后面的客户端发送数据?

时间:2014-02-13 16:42:11

标签: python qt udp pyqt

服务器具有公共IP,客户端位于nat之后。

客户端如何通过q​​t中的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)

1 个答案:

答案 0 :(得分: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地址和端口,并正确地远程返回服务器发送的数据包。