Ch04 Socket Names and DNS

五个必要的设定

    address family

     一般是AF_INET, IPV6就是AF_INET6

    socket type

      TCP选SOCK_STREAM,UDP选SOCK_DGRAM

    Protocol

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

    IP address

    UDP or TCP port number:

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

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

1>>> from socket import getaddrinfo 2>>> infolist = socket.getaddrinfo('gatech.edu', 'www') 3>>> pprint(infolist) 4[(2, 1, 6, '', ('130.207.244.244', 80)),   #得到了 5(2, 2, 17, '', ('130.207.244.244', 80))] 6>>> ftpca = infolist[0] 7>>> ftpca[0:3] 8(2, 1, 6) 9>>> s = socket.socket(*ftpca[0:3]) 10>>> ftpca[4] 11('130.207.244.244', 80) 12>>> 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)

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

    Python暂时不知道,socket.SOL_UDP

参数flags

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

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

DNS服务

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

    Default port: 53

    Libraries: PyDNS, dnspythonk, python3用不了

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

Zeroconf and Dynamic DNS

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

其他

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

1>>> import socket 2>>> socket.has_ipv6 3True

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

1>>> import socket 2>>> dir(socket) 3['AF_APPLETALK', 'AF_DECnet', 'AF_INET'
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )