#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<netinet/ip.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<arpa/inet.h>intmain(int argc,constchar*argv[]){int listenfd,maxfd;
listenfd=socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
server_addr.sin_port =htons(8888);
server_addr.sin_addr.s_addr=inet_addr("192.168.9.10");bind(listenfd,(struct sockaddr*)&server_addr,sizeof(server_addr));listen(listenfd,10);
fd_set setfd;
maxfd=listenfd;int nread;struct timeval time;struct sockaddr_in cliaddr;
socklen_t len =sizeof(cliaddr);int cfd;char ipv4_addr[16];int client[1024];int i,maxi,sockfd;
maxi=-1;for(i=0;i<1024;i++){
client[i]=-1;}char buf[20];while(1){FD_ZERO(&setfd);FD_SET(0,&setfd);FD_SET(1,&setfd);FD_SET(listenfd,&setfd);
time.tv_sec =5;
time.tv_usec =0;
nread=select(maxfd+1,&setfd,NULL,NULL,&time);if(nread<0){perror("select");exit(0);}if(nread==0){continue;}if(FD_ISSET(listenfd,&setfd)){
cfd=accept(listenfd,(struct sockaddr*)&cliaddr,&len);inet_ntop(AF_INET,&cliaddr.sin_addr,ipv4_addr,sizeof(ipv4_addr));printf("client is connect,addr is %s,port is %d\n",ipv4_addr,ntohs(cliaddr.sin_port));FD_SET(cfd,&setfd);for(i=0;i<1024;i++){if(client[i]<0){
client[i]=cfd;break;}}if(i==1024){printf("too many client");exit(0);}
maxi=i;FD_CLR(listenfd,&setfd);}for(i=0;i<maxi+1;i++){
sockfd=client[i];if(client[i]<0){continue;}if(FD_ISSET(sockfd,&setfd)){while(1){memset(buf,0,sizeof(buf));read(sockfd,buf,sizeof(buf));printf("client_addr is %s,port is %d,Client has data is %s\n",ipv4_addr,ntohs(cliaddr.sin_port),buf);if(strcmp(buf,"stop")==0){printf("Client is quit ,addr is %s,port is %d\n",ipv4_addr,ntohs(cliaddr.sin_port));break;}}FD_CLR(sockfd,&setfd);close(sockfd);
client[i]=-1;}}}return0;}