文件描述符fd

发布时间 2023-10-21 13:53:25作者: LiviaYu

目录

    • 在tcp的服务器端, 有两类文件描述符

      • 监听的文件描述符
        只需要有一个
        不负责和客户端通信, 负责检测客户端的连接请求, 检测到之后调用accept就可以建立新的连接
      • 通信的文件描述符
        负责和建立连接的客户端通信
        如果有N个客户端和服务器建立了新的连接, 通信的文件描述符就有N个,每个客户端和服务器都对应一个通信的文件描述符
    • 文件描述符对应的内存结构:
      一个文件文件描述符对应两块内存, 一块内存是读缓冲区, 一块内存是写缓冲区
      读数据: 通过文件描述符将内存中的数据读出, 这块内存称之为读缓冲区
      写数据: 通过文件描述符将数据写入到某块内存中, 这块内存称之为写缓冲区

    • 监听的文件描述符:
      客户端的连接请求会发送到服务器端监听的文件描述符的读缓冲区中
      读缓冲区中有数据, 说明有新的客户端连接
      调用accept()函数, 这个函数会检测监听文件描述符的读缓冲区
      检测不到数据, 该函数阻塞
      如果检测到数据, 解除阻塞, 新的连接建立

    • 通信的文件描述符:
      客户端和服务器端都有通信的文件描述符
      发送数据:调用函数 write() / send(),数据进入到内核中
      数据并没有被发送出去, 而是将数据写入到了通信的文件描述符对应的写缓冲区中
      内核检测到通信的文件描述符写缓冲区中有数据, 内核会将数据发送到网络中
      接收数据: 调用的函数 read() / recv(), 从内核读数据
      数据如何进入到内核程序猿不需要处理, 数据进入到通信的文件描述符的读缓冲区中
      数据进入到内核, 必须使用通信的文件描述符, 将数据从读缓冲区中读出即可