linux下C++ socket网络编程( 五 )

同步异步是对书店老板而言(同步老板不会提醒你找到结果了 , 异步老板会打电话告诉你) , 阻塞和非阻塞是对你而言 。

socket()函数创建套接字时 , 默认的套接字都是阻塞的 , 非阻塞设置方式代码:

//将文件描述符设置为非阻塞方式(利用fcntl函数)

fcntl(sockfd F_SETFL fcntl(sockfd F_GETFD 0)| O_NONBLOCK);

2. epoll

当服务端的人数越来越多 , 会导致资源吃紧 , I/O效率越来越低 , 这时就应该考虑epoll , epoll是Linux内核为处理大量句柄而改进的poll , 是linux特有的I/O函数 。 其特点如下:

1)epoll是Linux下多路复用IO接口select/poll的增强版本 , 其实现和使用方式与select/poll大有不同 , epoll通过一组函数来完成有关任务 , 而不是一个函数 。

2)epoll之所以高效 , 是因为epoll将用户关心的文件描述符放到内核里的一个事件列表中 , 而不是像select/poll每次调用都需要重复传入文件描述符集或事件集(大量拷贝开销) , 比如一个事件发生 , epoll无需遍历整个被监听的描述符集 , 而只需要遍历哪些被内核IO事件异步唤醒而加入就绪队列的描述符集合即可 。

推荐阅读