博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中如何中止accept
阅读量:5881 次
发布时间:2019-06-19

本文共 1173 字,大约阅读时间需要 3 分钟。

hot3.png

这里你得尝试理解一下

select是个古老的函数。在古老的UNIX系统里面,希望用单线程处理阻塞的网络函数,比如accept, recv, send,怎么办呢?于是我们的程序员老祖宗们发明了伟大的。
首先,考虑到我们的socket是一个一个的文件流(这一点很重要),于是我们设计了这个宏,把socket和状态级 readfd, writefd, errorfd捆绑起来,用定时轮循,限制这个函数操作在一个时间片内返回,将返回结果逐一核对,分别检查accept/recv/send有关的socket是不是动作了,如果有数据或者有结果采取处理,否则操作系统可以空闲下来干点别的:
 readfd;
FD_ZERO(&readfd);
FD_SET(sockfd,&readfd);
while(1){
sin_size=sizeof(struct );
/*select,第一个参数是用于检查所有socket,第二个参数检查缓冲测试区,第三个第四个也是,顺序是readfd, writefd和errorfd,最后一个参数是限制select检查用的等待时间*/
if(select(MAX_CONNECTED_NO,&readfd,NULL,NULL,(struct timeval *)0)> 0){
if((sockfd,&readfd)> 0){ /*可以进行accept了,直接放进来*/
if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){
perror( "accept ");
exit(1);
}
/*可以读取数据了*/
if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){
perror( "recv ");
exit(1);
}
if(read(client_fd,buf,MAXDATASIZE) <0){
perror( "read ");
exit(1);
}
printf( "received a connection :%s ",buf);
}/*if*/
close(client_fd);
}/*select*/
}/*while*/
这样,服务器可以不需要多线程、多进程就完成了所有socket的各种操作,比如accept,recv和send。令人惊讶的是,这样写的服务器程序稳定性和效率都远高于现在我们用的CreateProcess/CreateThread/fork/pthread_creaet等等,前辈的能耐真是让我们汗颜啊!
但愿你看明白了

转载于:https://my.oschina.net/u/4000302/blog/3043530

你可能感兴趣的文章
SpringCache学习实践
查看>>
zookeeper使用详解(命令、客户端、源码)
查看>>
使用getline输入一行字符串
查看>>
根css显示分类--元素分类
查看>>
DataGridViewCheckBoxColumn的Value值和EditFormatedValue值不一致
查看>>
shell学习之路:shell基础大全2
查看>>
mysql状态查看 QPS/TPS/缓存命中率查看
查看>>
AndroidGUI04:Button(Basic Button,ImageButton, Check Box, Toggle Button, Radio Button)的常用技巧...
查看>>
201314的总结和计划,继续加油吧
查看>>
memcached
查看>>
JavaScript初探二
查看>>
Linux环境下OpenSceneGraph的安装和配置
查看>>
poj 2484 A Funny Game
查看>>
(转)DateTimePicker中自定义时间或日期显示格式
查看>>
Centos的yum源设置为阿里云源
查看>>
Java SE 第九讲---面向对象特征之封装1
查看>>
python等自动化脚本编程利器 Script.NET
查看>>
跨浏览器CSS3渐变色
查看>>
为什么说 LINQ 要胜过 SQL
查看>>
动态弹出框,iframe的name包含一串随机数
查看>>