reator网络编程
epoll被称为事件管理器,利用管理器去管理多个连接。
int clientfd=accept(listenfd,addr,sz);
clientfd ==-1 && erro==EWOLDBLOCK //表示全连接中连接为空
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
error == EINPROGRESS //正在建立连接
error == EISCONN //连接建立成功
阻塞IO 和 非阻塞IO
-
阻塞在网络线程 -
连接的fd阻塞属性决定了io函数是否阻塞 -
具体差异在:io函数在数据未到达时是否立刻返回。
//默认情况下,fd时阻塞的,设置非阻塞的方法如下:
int flag=fcntl(fd,F_GETFL,0);
fcntl(fd,F_SETFL,flag | O_NONBLOCK);
想学习C++工程化、高性能及分布式、深入浅出。性能调优、TCP,协程,Nginx源码分析Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,Linux内核,P2P,K8S,Docker,TCP/IP,协程,DPDK 以下视频学习资料,有需要的可以点击:C++架构师学习资料 进去自取
?epoll_create 会去创建红黑树和就绪队列。
epoll_ctl 会去注册事件,会建立回调关系。当事件被触发,epoll_ctl 会将fd从红黑树中放到就绪队列。
?问:代码第9行能不能监听写事件?
答:不能,因为刚开始的时候,写缓冲区是空的,会被一直触发可写。
编程细节,返回值以及错误码
?读端关闭了。
?建议read()函数使用非阻塞io,因为出现错误会立刻返回,不会卡在这里影响别人。
?将数据写到缓冲区,协议栈会将数据发送到对端。
redis、nginx、memcached reactor具体使用
?redis-6.0支持IO多线程,封装在networking.cz中。
参考资料
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习
|