socket模块

socket模块

简介

socket即套接字,是用来创建网络通讯链接的基础,大量的应用程序都是经过套接字来实现网络通讯,诸如HTTP浏览器、RPC通讯、FTP下载等。html

使用

常见的TCP链接使用socket的通讯原语,如bind/listen/accept/connect/recv/sendall等,这里我不会介绍以上通用的原语,咱们讲讲一些其余的配置。python

创建socket使用socket.socket(socket.AF_INET, socket.SOCK_STREAM)浏览器

其中第一个参数为协议族,约定了socket的地址类型;第二个参数为socket类型,指定了面向协议的类型;其实还有第三个隐藏的参数,用来指定协议类型,但一般为0,这使得第二个参数能够自动选择对应socket的内置协议。服务器

AddressFamily

import socket

for af in iter(i for i in dir(socket) if i.startswith('AF_')):
    print(af)

协议族有socket.AF_INETsocket.AF_INET6,还有其余依赖于操做系统的协议族,能够经过上面的代码查看。网络

SocketKind

import socket

for sk in iter(i for i in dir(socket) if i.startswith('SOCK_')):
    print(sk)

socket类型通用的有socket.SOCK_STREAMsocket.SOCK_DGRAM,前者用于TCP链接,后者用于UDP链接,还有其它的依赖于操做系统的socket类型,经过上面代码查看。dom

配置

socket.setsockopt(level, optname, value),相关level和optname能够在查看<socket.h>文件或这里socket

level有一个经常使用的常量,SOL_SOCKET,是套接字级别的设置,而非协议层级别。操作系统

选择该level后可选设置有不少,用以下代码看下有哪些常量。code

import socket

for consts in iter(i for i in dir(socket) if i.startswith('SO_'))):
    print(consts)

SO_REUSEADDR

其值类型为布尔型整数(0或1),表示当socket断开链接后是否当即释放端口,默认为0,因此有时重启我的服务器会出现socket端口占用的异常,这是由于系统会自动保留一段时间socket端口。htm

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

sock.bind((ip or domain, port))

SO_KEEPALIVE

值类型布尔型整数,用于心跳检测(TCP协议栈四层),但只能检测链接是否存活,不能检测是否可用,而且网络故障致使的信息重传优先级比检测包高,会出现延时。

结论就是很差用,不如应用层的心跳检测。

相关文章
相关标签/搜索