0voice-2.1.4-http服务器的实现

reactor 怎么用

  • websever
  • websocket

框架

  • main

  • init_server

    • sockfd --> accept_cb
    • clientfd --> recv_cb , send_cb
  • epoll 的水平触发和边缘触发

    • 水平触发:要文件描述符处于可读或可写状态,epoll 就会持续不断地通知你

      • 假设 socket 接收缓冲区里有 2KB 的数据可读。
        epoll_wait() 会返回,告诉你这个 socket 可读了。
        你的程序只读取了 1KB 数据。
        此时缓冲区里还剩下 1KB 数据(它仍然处于“可读”的高电平状态)。
        下一次调用 epoll_wait() 时,它会再次返回,通知你这个 socket 依然可读,直到你把这个缓冲区里的数据全部读完(状态变为“低电平”)
    • 边沿触发:只在文件描述符的状态发生变化时(即从“不可读”变为“可读”,或从“不可写”变为“可写”的边缘)通知一次

      • 假设 socket 接收缓冲区从空变为有 2KB 数据(状态变化:不可读 -> 可读)。
        epoll_wait() 返回,通知你一次。
        你的程序必须这一次就把所有 2KB 数据全部读完,直到发生 EAGAINEWOULDBLOCK 错误(表示数据读完了)。
        在这个过程中,即使你只读了 1KB,缓冲区里还有 1KB 数据,epoll_wait() 也再也不会为这个“可读”状态通知你。除非再次有新的数据到达,导致缓冲区从空变为非空(再次发生状态变化),它才会通知你下一次。

posted @ 2025-09-29 10:01  xqy2003  阅读(8)  评论(0)    收藏  举报