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等等,前輩的能耐真是讓咱們汗顏啊!

希望你看明白了程序員

相關文章
相關標籤/搜索