poll.c
#define _GNU_SOURCE 1
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<sys/select.h>
#include<poll.h>
#define MAX 1024
void Initfd(struct pollfd *fds)
{
int i=0;
for(;i<MAX;++i)
{
fds[i].fd=-1;
}
}
void Insertfd(struct pollfd *fds,int fd,short events)
{
int i=0;
for(;i<MAX;++i)
{
if(fds[i].fd==-1)
{
fds[i].fd=fd;
fds[i].events=events;
break;
}
}
}
int main()
{
int listenfd=socket(AF_INET,SOCK_STREAM,0);
assert(listenfd!=-1);
struct sockaddr_in ser,cli;
ser.sin_family=AF_INET;
ser.sin_port=htons(6000);
ser.sin_addr.s_addr=inet_addr("127.0.0.1");
int res=bind(listenfd,(struct sockaddr*)&ser,sizeof(ser));
assert(res!=-1);
listen(listenfd,5);
struct pollfd fds[MAX];
Initfd(fds);
fds[0].fd=listenfd;
fds[0].events=POLLIN;
while(1)
{
int n=poll(fds,MAX,-1);
if(n==-1)
{
printf("poll error!\n");
exit(0);
}
else if(n==0)
{
printf("time out\n");
continue;
}
else
{
int i=0;
for(;i<MAX;++i)
{
if(fds[i].revents & POLLRDHUP)
{
printf("close\n");
close(fds[i].fd);
fds[i].fd=-1;
continue;
}
if(fds[i].revents & POLLIN)
{
if(fds[i].fd==listenfd)
{
int len=sizeof(cli);
int c=accept(listenfd,(struct sockaddr*)&cli,&len);
if(c<=0)
{
printf("one error");
continue;
}
Insertfd(fds,c,POLLIN|POLLRDHUP);
}
else
{
char buff[128]={0};
int n=recv(fds[i].fd,buff,127,0);
if(n<=0)
{
printf("break\n");
close(fds[i].fd);
fds[i].fd=-1;
continue;
}
printf("%d:%s",fds[i].fd,buff);
send(fds[i].fd,"ok",2,0);
}
}
}
}
}
return 0;
}