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
数据全部读完,直到发生EAGAIN
或EWOULDBLOCK
错误(表示数据读完了)。
在这个过程中,即使你只读了1KB
,缓冲区里还有1KB
数据,epoll_wait()
也再也不会为这个“可读”状态通知你。除非再次有新的数据到达,导致缓冲区从空变为非空(再次发生状态变化),它才会通知你下一次。
- 假设
-