文档章节

Ch04 Socket Names and DNS

能东棍
 能东棍
发布于 2013/12/26 23:43
字数 882
阅读 44
收藏 0

五个必要的设定

    address family

     一般是AF_INET IPV6就是AF_INET6

    socket type

      TCPSOCK_STREAMUDPSOCK_DGRAM

    Protocol

      Socket()接口的第三个参数有用到,一般填0,具体含义暂时不知道,好像是使用TCP还是UDP协议

    IP address    

    UDP or TCP port number:

    所有的套接字接口都会一定会用到这几个参数,例如socket.socket bind,就需要五个类型的参数设定了。

主动连接方,免去考虑使用IPV4还是IPV6getaddrinfo()

>>> from socket import getaddrinfo
>>> infolist = socket.getaddrinfo('gatech.edu', 'www')
>>> pprint(infolist)
[(2, 1, 6, '', ('130.207.244.244', 80)),   #得到了
(2, 2, 17, '', ('130.207.244.244', 80))]
>>> ftpca = infolist[0]
>>> ftpca[0:3]
(2, 1, 6)
>>> s = socket.socket(*ftpca[0:3])
>>> ftpca[4]
('130.207.244.244', 80)
>>> s.connect(ftpca[4])

    ftpca 是一个缩写,表示”family, type, protocol, canonicalname, and address”

    这样可以直接获取目标的配置信息,不需要进行额外的判断,直接进行连接操作。

getaddrinfo()参数说明和使用

    以下来自 python331.chm

    接口声明:socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)

    接口返回值: (family, type, proto, canonname, socketname)

 

参数family

    socket.AF_UNIX

    socket.AF_INET

    socket.AF_INET6

    These constants represent the address (and protocol) families, used for the first argument to socket(). If the AF_UNIX constant is not defined then this protocol is unsupported. More constants may be available depending on the system.

 

参数type

    socket.SOCK_STREAM   

    socket.SOCK_DGRAM  

    socket.SOCK_RAW

    socket.SOCK_RDM

    socket.SOCK_SEQPACKET

    These constants represent the socket types, used for the second argument to socket(). More constants may be available depending on the system. (Only SOCK_STREAM and SOCK_DGRAM appear to be generally useful.)

 

参数Protocol

     指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的不同传输协议。在Internet通讯域中,此参数一般取值为0,系统会根据套接字的类型(上一个参数类型)决定应使用的传输层协议。

         

    在VC++里面的类型有(ws2def.h)

#define IPPROTO_IP 0 /* dummy for IP */
#define IPPROTO_ICMP 1 /* control message protocol */
#define IPPROTO_IGMP 2 /* internet group management protocol */
#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */
#define IPPROTO_TCP 6 /* tcp */
#define IPPROTO_PUP 12 /* pup */
#define IPPROTO_UDP 17 /* user datagram protocol */
#define IPPROTO_IDP 22 /* xns idp */
#define IPPROTO_ND 77 /* UNOFFICIAL net disk proto */
#define IPPROTO_RAW 255 /* raw IP packet */
#define IPPROTO_MAX 256

    Python暂时不知道,socket.SOL_UDP

参数flags

    在VC++中的定义和说明(ws2def.h)

#define AI_PASSIVE                  0x00000001  // Socket address will be used in bind() call
#define AI_CANONNAME                0x00000002  // Return canonical name in first ai_canonname
#define AI_NUMERICHOST              0x00000004  // Nodename must be a numeric address string
#define AI_NUMERICSERV              0x00000008  // Servicename must be a numeric port number
#define AI_ALL                      0x00000100  // Query both IP6 and IP4 with AI_V4MAPPED
#define AI_ADDRCONFIG               0x00000400  // Resolution only if global address configured
#define AI_V4MAPPED                 0x00000800  // On v6 failure, query v4 and convert to V4MAPPED format
#define AI_NON_AUTHORITATIVE        0x00004000  // LUP_NON_AUTHORITATIVE
#define AI_SECURE                   0x00008000  // LUP_SECURE
#define AI_RETURN_PREFERRED_NAMES   0x00010000  // LUP_RETURN_PREFERRED_NAMES
#define AI_FQDN                     0x00020000  // Return the FQDN in ai_canonname
#define AI_FILESERVER               0x00040000  // Resolving fileserver name resolution

 

DNS服务

    搜寻域名对应的socketName时,一般先查找本地的hosts或者相应的缓存,如果上面两个都没有找到的话,那就通过DNS查找,通过DNS查找比较慢。第一次访问的时候速度比较慢,后面由于有了相应的缓   存,并且没有失效的话,那就不会通过DNS查找了。

       

    Default port: 53

    Libraries: PyDNS, dnspythonk, python3用不了

    使用上面的两个第三方库,可以通过查找DNS服务,查找MXMail Exchanger,邮件交换)记录来得到邮件地址所对应的邮件服务器的地址。

Zeroconf and Dynamic DNS

    当缺失DNS服务器时,可以使用另外两种技术来获取域名对应的socketname, Zeroconf Dynamic DNS

其他

   1.判断本地库是否具有IPv6的特性

>>> import socket
>>> socket.has_ipv6
True

 

    2.    查看一个对象的方法和属性

>>> import socket
>>> dir(socket)
['AF_APPLETALK', 'AF_DECnet', 'AF_INET'…

 




© 著作权归作者所有

共有 人打赏支持
能东棍
粉丝 7
博文 34
码字总数 25265
作品 0
南京
程序员
私信 提问
Shit! 我的host到底怎么了?

背景 那是今年五月的某一天,我的mac在切换系统host后,chrome迟迟不生效,依然访问的是原来的环境. 开发和测试同学在做项目时,需要经常进行 日常环境 预发环境 线上环境的切换,其实切的就是系统...

1355722719182168
08/22
0
0
Netty 4.1.13.Final 发布,Java 网络服务框架

Netty 4.1.13.Final 已发布,该版本包括 bug 修复,性能提升和新功能,建议用户升级。详细更新如下: Return the correct Future from FixedChannelPool.release() (#6908) Close channels t...

淡漠悠然
2017/07/07
1K
3
AlwaysOn业务IP和高可用IP分开使用(三)

方案二:主备源IP用于AG通信、主备新增网卡绑定IP用于业务访问 测试环境描述: 总体思路: 将业务使用的网卡和高可用使用的网卡分开,高可用优先使用到Ethernet 0,配置网卡优先级。在故障切...

UltraSQL
07/04
0
0
Node.js v0.10.27 (Stable) 发布

Node.js v0.10.27 (Stable) 发布了,改进记录包括: npm: upgrade to v1.4.8 openssl: upgrade to 1.0.1g uv: update to v0.10.27 dns: fix certain txt entries (Fedor Indutny) assert: En......

oschina
2014/05/02
1K
4
(读书笔记)网络是怎样连接的——浏览器生成消息

概览 本次探索之旅从用户在浏览器中输入网址(URL)开始。 生成HTTP请求消息 浏览器的工作会从对用户输入的网址进行解析开始。浏览器如何解析网址是我们的第一个看点。然后浏览器会根据网址的...

cjl72513
2017/12/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mgo初步接触

Intro mgo是mongodb的go语言绑定,第一次在静态类型语言中使用ORM,故留个笔记。 模型 mongodb是schema-less无模式的NoSQL非关系型数据库,理论上来说,在同一个表(mongodb中称为collectio...

御坂网络路由器
15分钟前
3
0
不要忽略异常(65)

请不要忽略异常, 尤其在api方法声明将会抛出的异常,这是定义者在试图说明某种问题 空的catch 块起到忽略异常的作用 对空的catch 块保持警惕,不应该出现 至少也要写明忽略该异常的原因 有一...

Java搬砖工程师
16分钟前
1
0
网站漏洞检测工具对discuzX3.2 X3.4网站漏洞修复

2018年12月9日,国内某安全组织,对discuz X3.2 X3.4版本的漏洞进行了公开,这次漏洞影响范围较大,具体漏洞是discuz 的用户前段SQL注入与请求伪造漏洞,也俗称SSRF漏洞,漏洞产生的原因首先...

网站安全
16分钟前
2
0
2018开发人员路线图

chinahufei
19分钟前
3
0
领哥,项目管理

领哥 https://www.leangoo.com/kanban/board_list

miaojiangmin
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部