文档章节

Ch04 Socket Names and DNS

能东棍
 能东棍
发布于 2013/12/26 23:43
字数 882
阅读 42
收藏 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
南京
程序员
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
(读书笔记)网络是怎样连接的——浏览器生成消息

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

cjl72513
2017/12/21
0
0
深入了解 Linux下安装DNS+Sendmail服务

DNS和Sendmail服务使用的人很多,笔者就给大家深入讲解下如何在Linux下安装DNS+Sendmail服务。 配置DNS详细过程 1.先设置好主机名 vi /etc/sysconfig/network 2.配置DNS主配置文件 vi /var/...

景光
2013/01/30
0
0
网站性能优化

虽然网站优化在这个话题有点大,我只能从自己的一些理解分享一些自己对于网站优化的意见。 一: 首先,我们在优化网站之前我们要搞清楚我们的一个基本的上网流程。 上网的过程不管多么复杂,...

无贝赛马
2014/04/12
30
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

移除或自定义 WordPress 仪表盘欢迎面板

第一次登录 WordPress 后台仪表盘页面,默认都会显示 WordPress 的欢迎面板: 如果我们要移除这个面板,在主题的 functions.php 中添加下面的代码即可: 12 //移除 WordPress 仪表盘欢迎面...

james_laughing
19分钟前
0
0
HashMap实现原理及源码分析

HashMap实现原理及源码分析   哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,...

DemonsI
22分钟前
0
0
eggjs学习笔记

快速初始化 生成项目(要求最低的node版本8.x) npm i egg-init -gegg-init egg-example --type=simplecd egg-examplenpm i 启动项目 npm run dev 配置 环境配置会覆盖默认配置 config...

别人说我名字很长
25分钟前
1
0
Winform Timer控件时间间隔

sender as System.Timers.Timer).Interval = 23 * 60 * 60 * 1000.0;//将时间间隔改为23小时,23小时后重新发生timer_Elapsed事件。 //60000:时间间隔1分钟,300000:时间间隔5分钟,600000:...

笑丶笑
26分钟前
0
0
在win10系统下怎样快速切换任务视图

切换窗口:Alt + Tab 任务视图:Win + Tab (松开键盘界面不会消失) 切换任务视图:Win + Ctrl +左/右 创建新的虚拟桌面:Win + Ctrl + D 关闭当前虚拟桌面:Win + Ctrl + F4...

SummerGao
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部