将getaddrinfo()作为服务器程序的目的是什么?

时间:2014-02-16 23:41:28

标签: sockets

我正在看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))]

1 个答案:

答案 0 :(得分:1)

您可以在以下位置配置端口(服务)的文本名称。 / etc / services,让服务器用getaddrinfo()来查看它应该监听哪个端口。

该步骤是可选的,您可以通过其他方式设置端口号。