socket

1.定义:

  socket又称为“套接字”,应用程序通常通过套接字向网络发去请求,或者应答网络请求,使主机之间或者一台计算机中的进程可以通讯。

2.创建:

   创建套接字 



1 import socket
2  
3 my_socket = socket.socket(family=AF_INIT, type=SOCK_STREAM, proto=0, fileno=None)



【参数】family:AF_INIT(IPv4地址族, 默认)  
                          AF_INET6(IPv6地址族) 

                          AF_UNIX(Unix地址族) 

                          AF_CAN(CAN总线)                                  

                          AF_RDS(汽车等移动收音)

              type:SOCK_STREAM(流服务,默认,传输层TCP)

                      SOCK_DGRAM(数据包,传输层UDP)

                      SOCK_RAW(原始套接字,用来自行组装数据包)

              proto:一般不填写,默认为0

                          当family=AF_CAN, proto则为CAN_RAW或者CAN_BCM

             返回值:<class 'socket.socket'>

3.socket对象方法:


my_socket.bind(address, port):将套接字绑定到地址,address格式取决于地址族。AF_INET下,以(host, port)元组(host为str格式,port为int格式,组成元组)表示。address一般写空字符串,监听任意IP地址,后面端口自己设置,监听所有自己设置端口的任意IP地址发送的请求连接。

my_socket.listen(backlog):启动服务器以接收连接。backlog为拒绝连接之前可连接的最大数量,至少为0

# backlog 代表着有多少个已经建立的但是没有被 accept 取走的连接数量。

另外,有个内核参数 net.core.somaxconn 定义了 socket 同时 listen 的最大连接数,所以 socket.listen() 指定的值不能超过 net.core.somaxconn。

# (不常用)my_socket.setblocking(bool):默认值为True,如果设置False,recv()或者accept()无数据,则报错

my_socket.accept():服务器接收客户端连接。返回(cli_connect_address, port)  # cli_connect_socket:client_connect_socket:客户端套接字,

# (不常用)socket.gethostname():返回python解释器当前运行的主机名

cli_socket.connect(address):客户端连接服务器。address格式取决于地址族。默认以address = (hostname, post),hostname为本机主机名,post为代连接服务器端口。

cli_socket.connect_ex(address):同上。只不过会有返回值。连接失败返回0,成功返回编码

my_socket.close()/cli_socket.close():关闭套接字。

s_cli_socket.recv(buffersize, flag):接收套接字数据。返回字符串,buffersize为最多接收的数量。

s_cli_socket.recvfrom(buffersize, flag):同上。返回(data, address),address为与之连接的地址。flag可省略。

s_cli_socket.send(string, flag):服务器接收连接后,向客户端发送数据。string可以为空。

sk.sendall(string, flag):向客户端发送全部数据。内部递归调用send(),成功返回None,失败抛出异常

sk.sendto(string[,flag],address):将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地

址。返回值是发送的字节数。该函数主要用于UDP协议。

sk.settimeout(timeout):设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时

期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s )

sk.getpeername():返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。

sk.getsockname():返回套接字自己的地址。通常是一个元组(ipaddr,port)

sk.fileno():套接字的文件描述符

se_socket.setsockopt(level, optname, value):设置给定套接字选项的值。level定义那个选项将被使用,通常为

SOL_SOCKET(正在使用的socket选项);当level=SOL_SOCK时,optname为下列值:

选项

定义


SO_BINDTODEVICE

可以使socket只在某个特殊的网络接口(网卡)有效。也许不能是移动便携设备

一个字符串给出设备的名称或者一个空字符串返回默认值

SO_BROADCAST

允许广播地址发送和接收信息包。只对UDP有效。如何发送和接收广播信息包

布尔型整数

SO_DONTROUTE

禁止通过路由器和网关往外发送信息包。这主要是为了安全而用在以太网上UDP通信的一种方法。不管目的地址使用什么IP地址,都可以防止数据离开本地网络

布尔型整数

SO_KEEPALIVE

可以使TCP通信的信息包保持连续性。这些信息包可以在没有信息传输的时候,使通信的双方确定连接是保持的

布尔型整数

SO_OOBINLINE

可以把收到的不正常数据看成是正常的数据,也就是说会通过一个标准的对recv()的调用来接收这些数据

布尔型整数

SO_REUSEADDR

当socket关闭后,本地端用于该socket的端口号立刻就可以被重用。通常来说,只有经过系统定义一段时间后,才能被重用。

布尔型整数

 

 

 

 

 

 

 

 

 

 

ser_socket.getsockopt(level, optname, [buflen]):返回套接字选项的值(bytes)。

ser_socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None):创建一个与该套接字相关联的文件,且该套接字必须处于阻塞模式,mode取值与内置的open()函数相同。