epoll中accept的使用细节
来源:互联网 发布:为什么淘宝网打不开 编辑:程序博客网 时间:2024/06/05 00:40
accept 要考虑 2 个问题
(1) 阻塞模式 accept 存在的问题
考虑这种情况:TCP连接被客户端夭折,即在服务器调用accept之前,客户端主动发送RST终止连接,导致刚刚建立的连接从就绪队列中移出,如果套接口被设置成阻塞模式,服务器就会一直阻塞在accept调用上,
直到其他某个客户建立一个新的连接为止。但是在此期间,服务器单纯地阻塞在accept调用上,就绪队列中的其他描述符都得不到处理。
解决办法: 把监听套接口设置为非阻塞,当客户在服务器调用accept之前中止某个连接时,accept调用可以立即返回-1,这时源自Berkeley的实现会在内核中处理该事件,并不会将该事件通知给epoll,而其他实现把errno设置为ECONNABORTED或者EPROTO错误,我们应该忽略这两个错误。
(2)ET模式下accept存在的问题
考虑这种情况:多个连接同时到达,服务器的TCP就绪队列瞬间积累多个就绪连接,由于是边缘触发模式,epoll只会通知一次,accept只处理一个连接,导致TCP就绪队列中剩下的连接都得不到处理。
解决办法: 用while循环抱住accept调用,处理完TCP就绪队列中的所有连接后再退出循环。如何知道是否处理完就绪队列中的所有连接呢?accept返回-1并且errno设置为EAGAIN就表示所有连接都处理完。综合以上两种情况,服务器应该使用非阻塞地accept,accept在ET模式下的正确使用方式为:
while ((conn_sock = accept(listenfd,(struct sockaddr *) &remote, (size_t *)&addrlen)) > 0) { handle_client(conn_sock);}if (conn_sock == -1) { if (errno != EAGAIN && errno != ECONNABORTED && errno != EPROTO && errno != EINTR) perror("accept");}
另附: https://stackoverflow.com/questions/46086680/why-not-the-accept-system-call-get-all-connected-in-noblock-epoll-lt
- epoll中accept的使用细节
- Linux下服务器端使用EPOLL ACCEPT产生的问题
- EPOLL下的accept(转载)
- EPOLL下的accept(转载)
- epoll 的accept , read, write
- epoll 的accept , read, write(重要)
- epoll 的accept , read, write(重要)
- epoll 的accept , read, write(重要)
- epoll 的accept , read, write(重要)
- epoll 的accept , read, write(重要)
- epoll 的accept , read, write(重要)
- epoll 的accept , read, write(重要)
- linux epoll accept 问题
- epoll accept 惊群
- accept与epoll惊群
- UNIX网络编程之epoll 的accept , read, write(重要)
- UNIX网络编程之epoll 的accept , read, write
- UNIX网络编程——epoll 的accept , read, write
- 迪丽热巴终于剪对了刘海!这么选刘海你的发型还有的救
- VPS独享主机技术原理
- 手机号归属地查询接口
- 一些常用css属性
- LeetCode 121. Best Time to Buy and Sell Stock
- epoll中accept的使用细节
- LintCode 379:Reorder array to construct the minimum number
- vue 路由之间传值 (编程式导航)
- PostgreSQL数据库从入门到精通
- DB2错误及解决方法
- 获取当前时间赋给data-
- json: java生成json数据示例
- 敏捷测试流程
- 死锁