diff options
-rw-r--r-- | src/alphacode/poller/poller.c | 240 |
1 files changed, 143 insertions, 97 deletions
diff --git a/src/alphacode/poller/poller.c b/src/alphacode/poller/poller.c index 2804fe27..7cd8c0b9 100644 --- a/src/alphacode/poller/poller.c +++ b/src/alphacode/poller/poller.c @@ -26,61 +26,134 @@ ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. **/ -int s; -struct pollfd poll_cli[2]; +#define NUM 256 -void wait_connect() +#define ZBXPOOL struct zbxpool_type + +ZBXPOOL { - int retval; + char ip[128]; + int port; + int socket; + int status; // 0 - not connected, 1 - connected, 2 - wrote data +}; - printf("Waiting for connect\n"); +ZBXPOOL pool[NUM]; - poll_cli[0].fd = s; - poll_cli[0].events = POLLOUT; +int s; - retval = poll(poll_cli,1,-1); +struct pollfd poll_cli[NUM]; - if(retval == 0) - { - printf("Poll timed out\n"); - exit(-1); - } - if(retval == -1) +void init_pool() +{ + int i; + + for(i=0;i<NUM;i++) { - perror("Poll\n"); - exit(-1); + pool[i].status=0; } - printf("Connected\n"); } -void wait_read() +void wait_connect() { - int retval; + int len; + char c[1024]; + int retval,i,j; - printf("Waiting data to read\n"); + int READ=0; - poll_cli[0].fd = s; - poll_cli[0].events = POLLIN; + printf("Waiting for connect\n"); - retval = poll(poll_cli,1,-1); - if(retval == 0) - { - printf("Poll timed out\n"); - exit(-1); - } - if(retval == -1) + for(;;) { - perror("Poll\n"); - exit(-1); +// printf("To process [%d]\n", NUM-READ); +// printf("-----------------------\n"); +// for(j=0;j<NUM-READ;j++) +// { +// printf("[%d] fd [%d] revents [%X]\n",j,poll_cli[j].fd,poll_cli[j].revents); +// } +// printf("-----------------------\n"); + if(NUM-READ<=0) break; + retval = poll(poll_cli,NUM-READ,-1); + + if(retval == 0) + { + printf("Poll timed out\n"); + exit(-1); + } + if(retval == -1) + { + perror("Poll\n"); + exit(-1); + } + + for(i=0;i<NUM-READ;i++) + { +// printf("[%d] remote socket [%X]\n",i,poll_cli[i].revents); + if ((poll_cli[i].revents&POLLHUP)==POLLHUP) + { + printf("[%d] remote socket has closed\n",i); + return; + } + if ((poll_cli[i].revents&POLLNVAL)==POLLNVAL) + { + memmove(&poll_cli[i], &poll_cli[i+1],(NUM-READ-i-1)*sizeof(struct pollfd)); + READ++; +// for(j=i;j<NUM-READ;j++) +// { +// memmove(&poll_cli[j], &poll_cli[j+1],sizeof(struct pollfd)); +// poll_cli[j].fd=poll_cli[j+1].fd; +// poll_cli[j].events=poll_cli[j+1].events; +// poll_cli[j].revents=poll_cli[j+1].revents; +// } + break; + } + if ((poll_cli[i].revents&POLLERR)==POLLERR) + { + printf("[%d] remote socket has error\n",i); + return; + } + if ((poll_cli[i].revents&POLLIN)==POLLIN) + { + printf("[%d] remote socket has data\n",i); + memset(c,0,1024); + len=read(poll_cli[i].fd, c, 1024); + printf("RESULT_STR [%d] [%s]\n", len, c); + if(len == -1) + { + perror("read"); + exit(-1); + } + + if(len == 0) + { + printf("Read 0 bytes\n"); + exit(-1); + } + close(poll_cli[i].fd); + poll_cli[i].events=-1; + break; + } + if ((poll_cli[i].revents&POLLOUT)==POLLOUT) + { + printf("[%d] remote socket ready for writing\n",i); + snprintf(c, 1024 - 1, "%s\n", "mysql.qps\n"); + if( write(poll_cli[i].fd,c,strlen(c)) == -1 ) + { + perror("write"); + exit(-1); + } + poll_cli[i].events=POLLIN; + break; + } + } } - printf("Data ready\n"); } - int main() { - int len; + int len,i; char c[1024]; char error[1024]; char ip[128]="127.0.0.1"; @@ -93,80 +166,53 @@ int main() struct linger ling; int retval; - - servaddr_in.sin_family=AF_INET; - hp=gethostbyname(ip); - - if(hp==NULL) + for(i=0;i<NUM;i++) { - perror("gethostbyname() failed"); - } + servaddr_in.sin_family=AF_INET; + hp=gethostbyname(ip); - servaddr_in.sin_addr.s_addr=((struct in_addr *)(hp->h_addr))->s_addr; + if(hp==NULL) + { + perror("gethostbyname() failed"); + } - servaddr_in.sin_port=htons(port); + servaddr_in.sin_addr.s_addr=((struct in_addr *)(hp->h_addr))->s_addr; - s=socket(AF_INET,SOCK_STREAM,0); + servaddr_in.sin_port=htons(port); - if(s == -1) - { - perror("socket() failed"); - } + s=socket(AF_INET,SOCK_STREAM,0); - if(fcntl(s, F_SETFL, O_NONBLOCK) == -1) - { - perror("fcntl() failed\n"); - exit(-1); - } - - retval = connect(s,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); - if(retval == 0) - { - printf("Socket connected immediately"); - } - else if(retval == -1) - { - if(errno == EINPROGRESS) + if(s == -1) { - printf("Connection in progress\n"); + perror("socket() failed"); } - else + + if(fcntl(s, F_SETFL, O_NONBLOCK) == -1) { - perror("connect"); - exit(-1); + perror("fcntl() failed\n"); + exit(-1); } - } - wait_connect(); - - snprintf(c, 1024 - 1, "%s\n", "system.uptime.error\n"); - printf("Before write\n"); - if( write(s,c,strlen(c)) == -1 ) - { - perror("write"); - exit(-1); - } - printf("After write [%d]\n",s); - wait_read(); - - memset(c,0,1024); - len=read(s, c, 1024); - if(len == -1) - { - perror("read"); - exit(-1); - } - - if(len == 0) - { - printf("Read on bytes\n"); - exit(-1); + retval = connect(s,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); + if(retval == 0) + { + printf("Socket connected immediately"); + } + else if(retval == -1) + { + if(errno == EINPROGRESS) + { + printf("Connection in progress\n"); + } + else + { + perror("connect"); + exit(-1); + } + } + poll_cli[i].fd = s; + poll_cli[i].events = POLLOUT; } - if( close(s)!=0 ) - { - perror("close"); - exit(-1); - } - printf("RESULT_STR [%d] [%c]\n", len, c); + wait_connect(); } |