recvfrom返回的地址的第二部分是什么?
我在使用这两段代码,来源于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
这是一个临时端口,客户端用它来向服务器发送数据。