02_套接字编程(socket抽象层)
1.套接字概述
1.套接概述: 套接是进行网络通信的一种手段(socket)
2.套接字分类:
流式套接字(SOCK_STREAM): 传输层基于tcp协议进行通信
数据报套接字(SOCK_DEGAM): 传输层基于udp协议进行通信
原始套接字(SOCK_RAW): 访问底层协议的套接字
3.TCP与UDP通讯模型流程图: https://www.processon.com/view/link/5ef43bfd1e0853263742690b
4.套接字属性和方法
import socket s = socket.socket() # 默认会创建流式套接字 # 功能: 获取套接字的描述符 # 描述符: 每一个IO操作系统都会分配一个不同的整数与之对应,该整数极为此IO操作的描述符 s.fileno() # 12 print(s.fileon()) # 12 # 获取套接字类型 s.type # <SocketKind.SOCK_STREAM: 1> print(s.type) # SocketKind.SOCK_STREAM # 获取套接字绑定的地址 s.getsockname() # ("0.0.0.0", 0) s.bind(("127.0.0.1", 7890)) print(s.getsockname()) # ("127.0.0.1", 7890) # 使用accept生成的套接字调用,获取该套接字对应的客户端的地址,在一个服务器有多个客户端连接时常会用到这个方法 s.listen(128) conn, addr = s.accept() # 阻塞时需要找一个用户连接 conn.getpeername() # ("127.0.0.1", 53519) print(conn.getpeername()) # ("127.0.0.1", 53519) # s.setsockopt(level, optname, value) 设置套接字选项 # 参数 level: 定义的选项类型,常用选项(IPPROTO_TCP,IPPROTO_IP,SOL_SOCKET) # 参数 optname: 根据level选项确定的子选项 # 参数 value: 根据子选项设置的值 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 设置端口重用 s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # 设置套接字允许接收广播 # s.getsockopt(level, optname) 获取套接字选项 # 参数 level: 定义的选项类型,常用选项(IPPROTO_TCP,IPPROTO_IP,SOL_SOCKET) # 参数 optname: 根据level选项确定的子选项 # 返回值: 返回根据子选项设置的值 s.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) # 1 # 面向锁的套接字方法 s.setblocking() # 设置套接字阻塞与非阻塞模式,参数默认为True表示阻塞 s.settimeout() # 设置阻塞套接字操作的超时时间 s.gettimeout() # 获取阻塞套接字操作的超时时间 # 面向文件的套接字函数 s.fileno() # 套接字的文件描述符 s.makefile() # 创建一个与该套接字相关的文件