地址和主机名
socket模块提供了几个函数用于使用主机名和地址。
1. socket.gethostname() # 返回运行程序所在的计算机的主机名
2. socket.gethostbyname(name) # 返回对应的IP地址或在查找失败后引发一个异常
此函数尝试将给定的主机名解释为一个IP地址。首先将检查当前计算机是否能够解释。如果不能,一个解释请求将发送给一个远程的DNS服务器(远程的DNS服务器 还可能将解释请求转发给另一个DNS服务器,直到该请求可以被处理)
3. socket.gethostbyname_ex(name) # 返回一个包含三个元素的元组
三个元素分别是给定地址的主要的主机名、同一IP地址的可选的域名的一个列表、关于同一主机的同一接口的其它IP地址的一个列表(列表可能都是空的)
4. socket.gethostbyaddr(address) # 返回一个包含三个元素的元组
效果与socket.gethostbyname_ex(name)函数相同,不过参数从域名换为ip地址
注:这里报了个错,我上网找了半天,可能是这个函数不用经过dns转换,无法获得域名等信息,解决方法是在hosts文件中增添映射。
5. socket.getservbyname(service,protocol) # 返回服务所使用的端口号
第一个参数是服务名,如‘http’、'ftp'等,第二个参数是传输协议,如'tcp'、'udp',默认None
6. socket.getservbyport(port) # 返回对应端口的服务名
7. socket.inet_aton(ip_addr)和socket.inet_ntoa(packed) # 非Python程序以32位字节包的形式存储和使用IP地址,这两个函数互相转换
8. getfqdn(name) # 返回关于给定主机名的全域名(如果省略,则返回本机的全域名)
socket也定义了一些变量来代表保留的IP地址:
INADDR_ANY和INADDR_BROADCAST是被保留的IP地址分别代表任意IP地址和广播地址;
INADDR_LOOPBACK代表loopback设备,总是地址127.0.0.1。这些变量是32位字节数字形式的
使用低级的socket通信
1. socket.socket(family,type[,proto]) # 创建一个新的socket对象
参数family:AF_UNIX基于文件类型的套接字,AF_INET基于网络类型的套接字(默认值)
参数type:基于TCP协议的SOCK_STREAM,基于UDP协议的SOCK_DGRAM
参数proto指定所使用的协议,如IPPROTO_TCP或IPPROTO_RAW,也可使用getprotobyname()函数得到对应协议
sk = socket.socket() # 默认生成一个tcp的socket对象sk
2. sk.close() # 关闭socket以尽快释放资源(尽管socket被垃圾回收器回收时将自动被关闭)
3. sk.shutdown(how) # 关闭连接一边或两边
参数0阻止socket接收数据,1阻止发送,2阻止接收和发送
4. socket.fromfd(fd,type[,proto]) # 从打开的一个文件描述符创建一个socket对象,文件描述符由文件的fileno()方法返回
文件描述符与一个真实的socket连接,而非一个文件。socket对象的fileno()方法返回关于这个socket的文件描述符。
5. sk.bind(address) # 绑定一个特定的地址和端口所组成的元组
6. sk.listen(backlog) # 监听连接进来的连接
参数表示在等待队列中允许放进来的连接总数。当等待队列已满时,如果有更多的连接到达,那么远程端将被告知连接被拒绝。在socket模块中的SOMAXCONN变量表明了等待队列所能容纳的最大量。
7. sk.accept() # 接收连接,返回一个连接对象和地址组成的元组
conn,address = sk.accept()
8. sk.connect(address) # 客户端发起连接
9. conn.send(message)和sk.send() # 分别在服务器和客户端发送数据
10. conn.recv(bufsize)和sk.recv(bufsize) # 分别在服务器和客户端接收数据
11. conn.close() # 关闭这次连接
12. send(string[,flags])和sendto(string[,flags],address) # 返回实际发送的字节数,-1表示发送错误
前者发送给定的字符串到已连接的远程socket,后者发送给定的字符串到一个特定的地址。
通常,send方法用于可靠连接的socket,sendto方法用于不可靠连接的socket,但是如果你在一个 UDP socket上调用connect来使它与一个特定的目标建立联系,那么这时也可以使用send方法来代替sendto。
13. recv(bufsize[,flags])和recvfrom(bufsize[,flags]) # 前者返回信息,后者返回信息和地址的元组
如果有大量的数据在等待,它只返回前面的bufsize字节数的数据。
参数flags,默认值为0,常见的flags有:
MSG_OOB:处理带外数据(既TCP紧急数据)
MSG_DONTROUTE:不使用路由表;直接发送到接口
MSG_PEEK:返回等待的数据且不把它们从队列中删除
14. sk.makefile([mode[,bufsize]]) # 返回一个文件类对象
文件对象封装了socket,以便于你以后将它传递给要求参数为一个文件的代码(使用文件的方法来代替send和 recv)
这个可选的mode和bufsize参数的取值和内建的open函数一样
15. sk.getpeername()和sk. getsockname() # 返回包含一个IP地址和端口的二元组
前者返回所连接的远程socket的地址和端口,后者返回关于本地socket的信息
16. sk.setblocking(flag) # 设置socket是否阻塞模式,参数flag等于0时为非阻塞
默认情况下,socket是阻塞式的,意思就是socket的方法的调用在任务完成之前是不会返回的。如果存储向外发送的数据的缓存已满,你又企图发送更多的数据,那么你对send的调用将被阻塞直到它能够将更多的数据放入缓存。当socket为非阻塞式的时候,如果所做的动作将导致阻塞,将会引起error异常。
17. sk. setsockopt(level,name,value) # 配置设置
参数socket代表了一个协议栈的不同层,level参数指定了选项应用于哪一层。level的取值以SOL_开头(SOL_SOCKET,SOL_TCP 等等)
参数name表明你涉及的是哪个选项
参数value,该选项要求数值的值时只能传入数字值。你也可以传递入一个缓存(一个字符串),但你必须使用正确的格式
18. sk.getsockopt(level,name[,buflen]) # 获取设置信息
如果函数不指定buflen参数意味着你要求一个数字值,并返回这个值。如果你提供了buflen,返回代表一个缓存的字符串,它的最大长度是buflen的字节数。
19. socket.nthol(x)和socket.ntohs(x)和socket.htonl(x)
第一个函数把一个网络字节顺序的数值并把它转换为当前主机字节顺序的相同数值,16进制
第二个函数把一个网络字节顺序的数值并把它转换为当前主机字节顺序的相同数值,32进制
第三个函数把一个当前主机字节顺序的数值并把它转换为网络字节顺序的相同数值