我正在看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))]
我把getaddrinfo和getsockname混淆了。 –
好吧,我想我現在明白了,或多或少。根據Python教程和你的評論,它將是'sockets端口上的一個服務的''serverocket.bind((「localhost」,socket.getaddrinfo(socket.gethostname(),'ssh')))''。 – CppLearner