?? poll.c
字號:
//#include "echo.h"#include <linux/poll.h>#include <netinet/in.h>#include <errno.h>#include <stdlib.h>#define MAXLINE 10#define OPEN_MAX 10intmain( int argc , char * * argv ){ int i , j, maxi , listenfd , connfd , sockfd; int nready; ssize_t n; char line[ MAXLINE ]; int clilen; struct pollfd client[ OPEN_MAX ]; struct sockaddr_in cliaddr , servaddr; listenfd = socket( AF_INET , SOCK_STREAM , 0 ); memset( &servaddr , 0 , sizeof( servaddr ) ); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl( INADDR_ANY ); servaddr.sin_port = htons( 10000 ); bind( listenfd , (struct sockaddr *)&servaddr , sizeof( servaddr ) ); listen( listenfd , 1024 ); client[0].fd = listenfd; client[0].events = POLLRDNORM; for( i = 1 ; i < OPEN_MAX ; i ++ ) client[i].fd = -1; maxi = 0; for( ; ; ) { nready = poll( client , maxi + 1 , 100 ); if( client[0].revents & POLLRDNORM ) { clilen = sizeof( cliaddr ); connfd = accept( listenfd , (struct sockaddr *)&cliaddr , &clilen ); //write(connfd, "CENTRE|NEW_JOB|1|sword|A|C|CENTRE\0", 255); for( i = 1 ; i < OPEN_MAX ; i ++ ) { if( client[i].fd < 0 ) { client[i].fd = connfd; break; } } if( i == OPEN_MAX ) { printf( "Too many clients!\n" ); exit( 1 ); } client[i].events = POLLRDNORM; if( i > maxi ) maxi = i; if( -- nready <= 0 ) continue; } for( i = 1 ; i <= maxi ; i ++ ) { if( ( sockfd = client[i].fd ) < 0 ) continue; if( client[i].revents & ( POLLRDNORM | POLLERR ) ) { if( ( n = read( sockfd , line , MAXLINE ) ) < 0 ) { if( errno == ECONNRESET ) { close( sockfd ); client[i].fd = -1; } else { printf( "readline error\n" ); exit( 1 ); } } else if( n == 0 ) { close( sockfd ); client[i].fd = -1; } else { for( j = 1; j <= maxi; j++ ) if( (sockfd = client[j].fd) > 0 ) write( sockfd , line , n ); } if( -- nready <= 0 ) break; } } }}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -