recvfrom返回的地址的第二部分是什么?

4 投票
2 回答
4829 浏览
提问于 2025-04-16 23:12

我在使用这两段代码,来源于http://wiki.python.org/moin/UdpCommunication

这是服务器的代码:

import socket

UDP_IP="127.0.0.1"
UDP_PORT=5005

sock = socket.socket( socket.AF_INET, # Internet
                      socket.SOCK_DGRAM ) # UDP
sock.bind( (UDP_IP,UDP_PORT) )

while True:
    data, addr = sock.recvfrom( 1024 ) # buffer size is 1024 bytes
    print "received message:", data,"from", addr

这是客户端的代码:

import socket

UDP_IP="127.0.0.1"
UDP_PORT=5005
MESSAGE="Hello, World!"

print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE

sock = socket.socket( socket.AF_INET, # Internet
                      socket.SOCK_DGRAM ) # UDP
sock.sendto( MESSAGE, (UDP_IP, UDP_PORT) )

在服务器的代码中,我修改了最后一行:

        print "received message:", data,"from", addr

这样它就可以打印出消息是从哪个地址发送过来的。在我的MacBook上,端口号似乎是40000到65000之间的某个随机数字(我只是觉得它看起来很随机)。

你知道这可能是什么原因吗?

2 个回答

1

这肯定是端口的问题。你可以在发送方那边用 print sock.getsockname() 来确认一下。

你也可以在 sock.sendto() 这一行之前,故意设置端口,比如用 sock.bind(('', 54312))

这样做在一些软件需要检查发送方端口范围的情况下会很有用:端口 0 到 1023 是特权端口——在很多操作系统中,只有 root 用户才能绑定这些端口。

不过,在绝大多数情况下,改变端口没有必要,所以通常最好还是保持原样。

这个端口的意义在于,它是识别连接或连接对方的元组中的第四个元素。这个元组是 (源_ip, 源端口, 目标_ip, 目标端口)。

3

这是一个临时端口,客户端用它来向服务器发送数据。

撰写回答