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的内置协议。服务器
import socket for af in iter(i for i in dir(socket) if i.startswith('AF_')): print(af)
协议族有socket.AF_INET
,socket.AF_INET6
,还有其余依赖于操做系统的协议族,能够经过上面的代码查看。网络
import socket for sk in iter(i for i in dir(socket) if i.startswith('SOCK_')): print(sk)
socket类型通用的有socket.SOCK_STREAM
,socket.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)
其值类型为布尔型整数(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))
值类型布尔型整数,用于心跳检测(TCP协议栈四层),但只能检测链接是否存活,不能检测是否可用,而且网络故障致使的信息重传优先级比检测包高,会出现延时。
结论就是很差用,不如应用层的心跳检测。