【问题标题】:UDP client cannot talk through an external IP addressUDP 客户端无法通过外部 IP 地址进行通信
【发布时间】:2013-05-15 00:15:54
【问题描述】:

我正在运行 UDP 服务器和客户端 (python)。当在同一个本地网络中时,客户端能够与服务器通信。但是,当服务器 IP 地址设置为路由器的 IP 地址(具有 UDP 端口转发到服务器)时,客户端根本无法与服务器通信。我想知道是否有人可以指出为什么这在本地网络中(在不同的机器上)有效,但我无法使用客户端和服务器都连接到的路由器的外部 IP 地址使客户端连接到服务器。

客户端代码

import socket
import sys

HOST, PORT = "<IP address of router which is port forwarded to server>", 5000
data = " Hello from Client" #.join(sys.argv[1:])

# SOCK_DGRAM is the socket type to use for UDP sockets
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# As you can see, there is no connect() call; UDP has no connections.
# Instead, data is directly sent to the recipient via sendto().
sock.sendto(data + "\n", (HOST, PORT))
received = sock.recv(1024)

print "Sent:     {}".format(data)
print "Received: {}".format(received)

服务器代码

import SocketServer

class MyUDPHandler(SocketServer.BaseRequestHandler):


    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print "{} wrote:".format(self.client_address[0])
        print data
        socket.sendto(data.upper(), self.client_address)

if __name__ == "__main__":

    HOST, PORT = "<local IP address of server", 5000
    server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler)
    server.serve_forever()

【问题讨论】:

  • 首先,通过 netcat 或类似的方式测试您的网络连接:server -> nc -ul 5000;客户端-> nc -u server_ip 5000
  • 如果您将路由器配置为将外部端口转发到服务器的内部地址,则只能从外部访问本地服务器。 en.wikipedia.org/wiki/Port_forwarding 其他技术是 udp 打孔 - 为此客户端和服务器必须知道彼此的 ip&port。您可以使用 pystun 获取您的外部 IP 地址。

标签: python udp client-server


【解决方案1】:

好的,我知道发生了什么。

路由器连接到两台计算机 - 计算机 A 和计算机 B。计算机 A 可以使用本地网络(UDP 服务器客户端)与计算机 B 通信。但是,当计算机 A(UDP 客户端)使用路由器 IP 地址(外部 IP 地址)将数据发送到计算机 B(UDP 服务器)时,路由器端口转发到计算机 B,它不工作。显然,当客户端使用外部 IP 地址时,服务器只会接受来自本地网络之外的连接

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多