2011-08-09 27 views
4

我使用的那些2個的代碼從http://wiki.python.org/moin/UdpCommunicationrecvfrom返回的地址的第二部分是什麼?

服務器:

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之間的一些隨機數(我確信它看起來是隨機的)。

不知道這可能是什麼?

回答

3

這是一個ephemeral port客戶端用來發送數據到服務器。

+0

我真的不明白這種端口的用途,這個端口是否在這裏,所以一個應用程序有一個改變來做出某種答案? – jokoon

+0

這個想法是,對於那些必須長時間收聽它們的重要事情,需要較少數量的端口,所以客戶端應用程序不會妨礙他們,而是從當時可用的任何高端端口發送。 – agf

+0

我的意思是我不能指定要使用的端口嗎? – jokoon

1

它絕對是港口。您可以在發件人一側使用print sock.getsockname()進行驗證。

你也可以故意用e。 G。 sock.bind(('', 54312))之前sock.sendto()一行。

這在軟件檢查發件人的端口範圍的上下文中很有用:端口0..1023是特權端口 - 在許多操作系統下,只允許root綁定到這些端口。

但是,在絕大多數情況下,改變它並沒有意義,所以最好是讓它保持原樣。

此端口的含義是元組的第4個元素,用於標識連接的連接或對應連接。元組是(source_ip,source_port,destination_ip,destination_port)。

相關問題