#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <poll.h>
//单线程poll
int main(int argc, const char *argv[]){
int lfd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in msg_st={AF_INET,htons(6666),inet_addr("192.168.250.100")};
bind(lfd,(struct sockaddr*)&msg_st,sizeof(msg_st));
listen(lfd,5);
int i=0,cfd=0,maxfd=0,num=0,size=2000;
char buff[128]={0};
struct pollfd *event_s=(struct pollfd *)malloc(sizeof(event_s)*size);
memset(event_s,0,size);
event_s->fd=lfd;
event_s->events=POLLIN;
for(i=1;i<2000;i++){
(event_s+i)->fd=-1;
(event_s+i)->events=POLLIN;
}
printf("服务器启动\n");
while (1){
num=poll(event_s,maxfd+1,-1);
if(event_s->revents&POLLIN){
cfd=accept(lfd,NULL,NULL);
for(i=0;i<2000;i++){
if((event_s+i)->fd==-1){
(event_s+i)->fd=cfd;
break;
}
}
printf("连接成功\n");
if(i>maxfd){
maxfd=i;
}
}
for(i=1;i<=maxfd;i++){
if((event_s+i)->revents&POLLIN){
if(0==recv((event_s+i)->fd,buff,sizeof(buff)-1,0)){
printf("断开连接\n");
(event_s+i)->fd=-1;
}else{
printf("%s\n",buff);
memset(buff,0,sizeof(buff));
}
}
}
}
free(event_s);
close(lfd);
return 0;
}
单线程poll缺点:通信的内容较大或连接的客户机较多时,延迟严重,还可能发生信息的粘连