summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/alphacode/poller/poller.c240
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();
}