python getaddrinfo 函数
现在python中用到的关于地址查询的函数几乎都可以用getaddrinfo。 也就是说,如果你要想做一些与地址查询,主机名ip转换的操作,都可以用这个函数,下面看一下这个函数。
首先,我们可以用getaddrinfo查询到想访问主机的ip地址和端口号
>>> import socket
>>> from pprint import pprint
>>> infolist=socket.getaddrinfo('baidu.com','www')
>>> pprint(infolist)
[(2, 1, 6, '', ('220.181.111.86', 80)),
(2, 2, 17, '', ('220.181.111.86', 80)),
(2, 1, 6, '', ('123.125.114.144', 80)),
(2, 2, 17, '', ('123.125.114.144', 80)),
(2, 1, 6, '', ('220.181.111.85', 80)),
(2, 2, 17, '', ('220.181.111.85', 80))]
可以看到我们提供了主机名 baidu.com 和 想要访问的端口号 www。 getaddrinfo就会为我们返回可以用来访问的地址。从返回的数据看出有多个地址可以访问www.baidu.com。
取其中任意一个地址分析一下:
(2, 1, 6, '', ('220.181.111.86', 80))
这个地址可以简称为ftpca。f是family,t是type,p是protocol,c是cononnical name,a是address。这个ftpca的 前三位可以用来构造一个socket
2 是 AF_INET
1 是 SOCK_STREAM
6 是 IPPROTOTCP
这些都是可以用来构建一个socket的。 比如接下来的代码。
>>> ftpca=infolist[0]
>>> ftpca[0:3]
(2, 1, 6)
>>> s=socket.socket(*ftpca[0:3])
>>> ftpca[4]
('220.181.111.86', 80)
>>> s.connect(ftpca[4])
首先,我们把地址列表中的第一个地址单独获得赋给变量ftpca。 然后用ftpca[0:3]就是前三位构建了一个socket。在构建的时候使用了*是说明传入的参数不是一个list而是单独的个体。这是socket constructor的特性。而后面我们用s.connect调用地址去连接并且连接成功。这里注意的是没有使用*,说明connect函数的参数可以是一个 list 。
其次,可以用getaddrinfo的一个地方就是,我们可以用该函数获取我们需要bind的信息。比如你的程序要把socket bind到当前的机器上。bind所需要的信息就可以用getaddrinfo获取。
>>> getaddrinfo(None,'ssh',0,socket.SOCK_STREAM,0,socket.AI_PASSIVE)
[(2, 1, 6, '', ('0.0.0.0', 22)), (10, 1, 6, '', ('::', 22, 0, 0))]
先解释一下参数的意思。
None 是传入主机名的地方,这里用none就是说当前主机。
ssh 是端口号。
0 默认稍后解释是什么参数。
socket.SOCK_STREAM是tcp。getaddrinfo这个函数返回的值是ftpca。tp就是说返回的值里包含了scoket type。这里的socket.SOCK_STREAM指定了type是TCP
0 more稍后解释是什么参数。
socket.AI_PASSIVE要结合前面的None来理解。我们用了none + socket.AI_PASSIVE这两个参数。这样函数把当前机器所有的地址都返回了。可是如果你只想返回当前机器的某个ip。比如当前机器的loopback interface的信息,你就可以把none 换成127.0.0.1 把socket.AI_PASSIVE去掉。
有的时候,你通过getaddrinfo去获得的地址很多你都用不了,比如你的机器只支持IPv4而目标机器支持IPv4和IPv6。通过下面的方式你就可以获得你可以使用的地址
>>> getaddrinfo('ftp.kernel.org', 'ftp', 0, socket.SOCK_STREAM, 0,
... socket.AI_ADDRCONFIG | socket.AI_V4MAPPED)
[(2, 1, 6, '', ('204.152.191.37', 21)),
(2, 1, 6, '', ('149.20.20.133', 21))]
socket.AI_ADDRCONFIG这个参数让getaddrinfo返回你可以使用的地址。
那么这里使用的socket.AI_V4MAPPED是做什么用的呢? 考虑下面这种情况。你的机器仅支持IPv6而你要访问的服务仅支持IPv4。用了这个参数,返回的地址会做一些处理,映射成ipv6格式 这样你就可以连接该服务了。
回顾之前说的getaddrinfo返回的地址格式是ftpca。 这里的c是conninonical name。 但是可以看到之前返回的这个位置都是空的。那么怎么样才能获得这个值呢?用下面的方式。
>>> getaddrinfo('iana.org', 'www', 0, socket.SOCK_STREAM, 0,
... socket.AI_ADDRCONFIG | socket.AI_V4MAPPED | socket.AI_CANONNAME)
[(2, 1, 6, '43-8.any.icann.org', ('192.0.43.8', 80))]
python getaddrinfo 函数的更多相关文章
- python的函数
函数一词起源于数学,但是在编程中的函数和数学中的有很大不同.编程中的函数式组织好的,可重复使用的,用于实现单一功能或相关联功能的代码块. 我们在学习过程中已经使用过一些python内建的函数,如pri ...
- python strip()函数 介绍
python strip()函数 介绍,需要的朋友可以参考一下 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除 ...
- python split()函数
Python split()函数 函数原型: split([char][, num])默认用空格分割,参数char为分割字符,num为分割次数,即分割成(num+1)个字符串 1.按某一个字符分割. ...
- Python数学函数
1.Python数学函数 1.abs(x):取绝对值,内建函数 2.math.ceil(x):向上取整,在math模块中 3.cmp(x,y):如果 x < y ,返回-1:如果 x == y ...
- Python回调函数用法实例详解
本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
- Python之函数与变量
本节内容 函数介绍及其作用 函数的定义与调用 函数的参数说明 全局变量与局部变量 值传递和引用传递 一.函数的介绍及其作用 编程语言中的函数与数学中的函数是有区别的:数学中的函数有参数(输入),就会有 ...
- Python基础-函数篇
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 函数与函数式编程 1.面向对象: 华山派-- ...
- 【C++实现python字符串函数库】strip、lstrip、rstrip方法
[C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...
- 【C++实现python字符串函数库】二:字符串匹配函数startswith与endswith
[C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...
随机推荐
- [Apple开发者帐户帮助]八、管理档案(4)
您可以编辑,下载或删除在开发人员帐户中创建的配置文件.例如,如果您撤消了证书或禁用了配置文件中包含的设备,请编辑配置文件.或重新置备的个人资料,如果因为你它是无效的功能的应用程式服务. 注意: Xco ...
- 【Kafka】《Kafka权威指南》——从Kafka读取数据
应用程序使用 KafkaConsumer向 Kafka 订阅主题,并从订阅的主题上接收消息 . 从 Kafka 读取数据不同于从其他悄息系统读取数据,它涉及一些独特的概念和想法.如果不先理解 这些概念 ...
- 334 Increasing Triplet Subsequence 递增的三元子序列
给定一个未排序的数组,请判断这个数组中是否存在长度为3的递增的子序列.正式的数学表达如下: 如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1, ...
- ActiveMQ 5.10.0 安装与配置
先在官网下载activeMQ,我这里是5.10.0. 然后在解压在一个文件夹下即可. 我这里是:D:\apache-activemq-5.10.0-bin 然后进入bin目录:D:\apache-ac ...
- Task.Run 和 Task.Factory.StartNew
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...
- Android 升级安装APK兼容Android7.0,解决FileUriExposedException
我们在开发app时避免不了需要添加应用内升级功能.当app启动时,如果检测到最新版本,将apk安装包从服务器下载下来,执行安装.安装apk的代码一般写法如下,网上随处可以搜到 public stati ...
- html5——伸缩布局
基本概念 1.主轴:Flex容器的主轴主要用来配置Flex项目,默认是水平方向 2.侧轴:与主轴垂直的轴称作侧轴,默认是垂直方向的 3.方向:默认主轴从左向右,侧轴默认从上到下 4.主轴和侧轴并不是固 ...
- html5——语义标签
传统布局 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF- ...
- JS——for
打印两行星星: <script> for (var i = 0; i < 2; i++) { for (var j = 0; j < 10; j++) { document.w ...
- zabbix配置邮件报警(第四篇)
zabbix配置邮件报警(第四篇) 邮件报警可采用本地邮件服务,也可以自定义脚本,这里我采用本地邮件服务报警 添加收件人