C++中如何停止accept

这里你得尝试理解一下select函数

select是个古老的函数。在古老的UNIX系统里面,但愿用单线程处理阻塞的网络函数,好比accept, recv, send,怎么办呢?因而咱们的程序员老祖宗们发明了伟大的select函数
首先,考虑到咱们的socket是一个一个的文件流(这一点很重要),因而咱们设计了FD_SET这个宏,把socket和状态级fd_set readfd, writefd, errorfd捆绑起来,用select函数定时轮循,限制这个函数操做在一个时间片内返回,将返回结果逐一核对,分别检查accept/recv/send有关的socket是否是动做了,若是有数据或者有结果采起处理,不然操做系统能够空闲下来干点别的:

fd_set readfd;
FD_ZERO(&readfd);
FD_SET(sockfd,&readfd);
while(1){
sin_size=sizeof(struct sockaddr_in);
/*select,第一个参数是用于检查全部socket,第二个参数检查缓冲测试区,第三个第四个也是,顺序是readfd, writefd和errorfd,最后一个参数是限制select检查用的等待时间*/
if(select(MAX_CONNECTED_NO,&readfd,NULL,NULL,(struct timeval *)0)> 0){
if(FD_ISSET(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等等,前辈的能耐真是让咱们汗颜啊!

希望你看明白了程序员

相关文章
相关标签/搜索