2014-02-16 82 views
0

我正在看Coursea上的Computer Network。 getaddrinfo對客戶端程序(將服務器名稱解析爲網絡地址)有意義,但爲什麼服務器程序需要getaddrinfo才能綁定到套接字?將getaddrinfo()作爲服務器程序的目的是什麼?

請參閱https://d396qusza40orc.cloudfront.net/comnetworks/lect%2F1-4-sockets-ink.pdf

感謝12頁。


這是Python的教程。 http://docs.python.org/3/howto/sockets.html#creating-a-socket

正如你所看到的,我可以在bind中分配一個端口。但_socketobject級別有getaddrinfo()。 (嘗試訪問serversocket.getaddrinfo())。


編輯

好。根據nos的評論,我認爲這就是他的意思。

假設您希望在端口22上運行自己的SSH程序。爲了操作系統可移植性,由於端口在/etc/services中定義,因此您可以要求套接字將端口從OS轉換。

import socket 
# create an INET, STREAMing socket 
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
# bind the socket to a public host, and a well-known port 
ssh_addrinfo = socket.getaddrinfo(socket.gethostname(), 'ssh')[0][4] 
serversocket.bind(ssh_addrinfo) 
# become a server socket 
serversocket.listen(5) 
serversocket.close() 

ssh_addrinfo看起來是這樣的:

>>> socket.getaddrinfo(socket.gethostname(), 'ssh') 
[(2, 2, 17, '', ('192.168.33.1', 22)), (2, 1, 6, '', ('192.168.33.1', 22)), (2, 2, 17, '', ('192.168.1.4', 22)), (2, 1, 6, '', ('192.168.1.4', 22)), (30, 2, 17, '', ('fe80::2acf:e9ff:fe1e:4985%en0', 22, 0, 4)), (30, 1, 6, '', ('fe80::2acf:e9ff:fe1e:4985%en0', 22, 0, 4))] 

回答

1

您可以爲端口(服務)配置一個文本名稱中如/ etc/services,然後讓服務器用getaddrinfo()來查看它應該監聽哪個端口。

該步驟是可選的,但您可以通過其他方式設置端口號。

+0

我把getaddrinfo和getsockname混淆了。 –

+0

好吧,我想我現在明白了,或多或少。根據Python教程和你的評論,它將是'sockets端口上的一個服務的''serverocket.bind((「localhost」,socket.getaddrinfo(socket.gethostname(),'ssh')))''。 – CppLearner

相關問題