我正在看Coursea上的计算机网络。 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
如您所见,我可以在绑定时指定一个端口。但getaddrinfo()
级别中有_socketobject
。 (尝试访问serversocket.getaddrinfo()
)。
修改
好。根据nos的评论,我认为这就是他的意思。
假设您想在端口22上运行自己的SSH程序。为了实现操作系统的可移植性,由于端口在/etc/services
中定义,您可以请求socket从操作系统转换端口。
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))]
答案 0 :(得分:1)
您可以在以下位置配置端口(服务)的文本名称。 / etc / services,让服务器用getaddrinfo()来查看它应该监听哪个端口。
该步骤是可选的,您可以通过其他方式设置端口号。