Python网络编程——socket模块

    xiaoxiao2022-07-03  135

    socket 套接字模块用于TCP、UDP、IP等协议的通讯。

     

    基本使用方法有:

    1.  创建socket对象

    socket.socket(family=socket.AF_INETtype=socket.SOCK_STREAMproto=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_STREAMSOCK_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_TCPTCP协议

    17                  等价于IPPROTO_UDPUDP协议

    255                等价于IPPROTO_RAW,常搭配原始套接字类型

    1+.  设置套接字选项

    setsockopt(level,optname,optval)

    使用方法举例:

    s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

    1level指定控制套接字的层次.可以取三种值:

    SOL_SOCKET:通用套接字选项.

    IPPROTO_IPIP选项.

    IPPROTO_TCPTCP选项.

    2optname指定控制的方式(选项的名称),不同的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

    3optval选项取值,例如10假或其他取值

     

    2.  服务端套接字地址绑定

    bind()在服务端设置服务端ip和端口

    使用方法:对象变量.bind(元组类型的服务端IP和端口)

    格式举例:

    s.bind(('127.0.0.1',9999))

    3.  服务端监听链接

    listen()监听IP和端口,设置一个参数,表示最多连接排队数量

    使用方法:对象变量.listen(排队数)

    格式举例:

    s.listen(5)

    4.  服务端等待接收客户端请求

    accept()等待接收客户端的请求,一旦有客户端请求连接,就会返回两个值,一个是连接对象,一个是客户端的地址信息,所以需要两个变量来接收

    注意:accept()是阻塞的,意思就是程序执行带这里就是等待状态,在没有客户端请求连接的情况下,下面的代码将不会执行,只有客户端请求连接时下面的代码才会被执行

    accept()被客户端连接一次后就会被中断,可以写个while循环让它永远等待客户端连接

    使用方法:定义连接变量,定义客户端地址信息变量 = 对象变量.accept()

    格式举例:

    c, a = s.accept()

    5.  客户端建立连接

    connect()连接服务端,在客户端绑定服务端IP和端口

    使用方法:对象变量.socket(元组类型的服务端IP和端口)

    格式举例:

    s.connect(('127.0.0.1', 9999))

    6.  客户端关闭连接

    close()在客户端关闭连接

    使用方法:对象变量.close()

    格式举例:

    s.close()

     

    最新回复(0)