socket 套接字模块用于TCP、UDP、IP等协议的通讯。
基本使用方法有:
socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, fileno=None)
使用方法举例
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)说明:
(1)socket families(地址簇):
AF_UNIX # unix本机之间进行通信
AF_INET #使用IPv4
AF_INET6 #使用IPv6
注:socket.socket()中第一个参数能使用上述值。
(2)socket types:
SOCK_STREAM # TCP套接字类型
SOCK_DGRAM # UDP套接字类型
SOCK_RAW #原始套接字类型,功能强大
SOCK_RDM #是一种可靠的UDP形式,即保证交付数据报但不保证顺序。
SOCK_SEQPACKET #可靠的连续数据包服务
注:这些常量都是套接字类型,应用于socket()函数中的第二个参数中,根据系统的不同,可能有更多的常数。虽然SOCK_STREAM和SOCK_DGRAM更常见,但原始套接字SOCK_RAW也经常用于某些特殊的网络操作。SOCK_RAM原始套接字用来提供对原始协议的低级访问,可以处理特殊的IPv4报文,在需要执行某些特殊操作时使用,例如普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以。创建这种套接字可以监听网卡上的所有数据帧;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
(3)proto协议
0 (默认,可不写)与特定的地址家族相关的协议,如果是 0 ,则系统就会根据地址格式和套接类别,自动选择一个合适的协议
1 等价于IPPROTO_ICMP,ICMP协议
6 等价于IPPROTO_TCP,TCP协议
17 等价于IPPROTO_UDP,UDP协议
255 等价于IPPROTO_RAW,常搭配原始套接字类型
setsockopt(level,optname,optval)
使用方法举例:
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)(1)level指定控制套接字的层次.可以取三种值:
SOL_SOCKET:通用套接字选项.
IPPROTO_IP:IP选项.
IPPROTO_TCP:TCP选项.
(2)optname指定控制的方式(选项的名称),不同的level可提供的选项有所不同
SOL_SOCKET
SO_BROADCAST
允许发送广播数据
int
SO_DEBUG
允许调试
int
SO_DONTROUTE
不查找路由
int
SO_ERROR
获得套接字错误
int
SO_KEEPALIVE
保持连接
int
SO_LINGER
延迟关闭连接
struct linger
SO_OOBINLINE
带外数据放入正常数据流
int
SO_RCVBUF
接收缓冲区大小
int
SO_SNDBUF
发送缓冲区大小
int
SO_RCVLOWAT
接收缓冲区下限
int
SO_SNDLOWAT
发送缓冲区下限
int
SO_RCVTIMEO
接收超时
struct timeval
SO_SNDTIMEO
发送超时
struct timeval
SO_REUSERADDR
允许重用本地地址和端口
int
SO_TYPE
获得套接字类型
int
SO_BSDCOMPAT
与BSD系统兼容
int
IPPROTO_IP
IP_HDRINCL
在数据包中包含IP首部
int
IP_OPTINOS
IP首部选项
int
IP_TOS
服务类型
IP_TTL
生存时间
int
IPPRO_TCP
TCP_MAXSEG
TCP最大数据段的大小
int
TCP_NODELAY
不使用Nagle算法
int
(3)optval选项取值,例如1真0假或其他取值
bind()在服务端设置服务端ip和端口
使用方法:对象变量.bind(元组类型的服务端IP和端口)
格式举例:
s.bind(('127.0.0.1',9999))listen()监听IP和端口,设置一个参数,表示最多连接排队数量
使用方法:对象变量.listen(排队数)
格式举例:
s.listen(5)accept()等待接收客户端的请求,一旦有客户端请求连接,就会返回两个值,一个是连接对象,一个是客户端的地址信息,所以需要两个变量来接收
注意:accept()是阻塞的,意思就是程序执行带这里就是等待状态,在没有客户端请求连接的情况下,下面的代码将不会执行,只有客户端请求连接时下面的代码才会被执行
accept()被客户端连接一次后就会被中断,可以写个while循环让它永远等待客户端连接
使用方法:定义连接变量,定义客户端地址信息变量 = 对象变量.accept()
格式举例:
c, a = s.accept()connect()连接服务端,在客户端绑定服务端IP和端口
使用方法:对象变量.socket(元组类型的服务端IP和端口)
格式举例:
s.connect(('127.0.0.1', 9999))close()在客户端关闭连接
使用方法:对象变量.close()
格式举例:
s.close()