server 端#include <stdio.h>#include <stdlib.h>#include <netinet/in.h>#include <string.h>#include <arpa/inet.h>#include <unistd.h>#include <sys/select.h>#include <sys/types.h>#include <sys/time.h>#define MAXLINE 50typedef struct sockaddr SA;int main(int argc,char **argv){int listenfd,connfd;struct sockaddr_in myaddr;fd_set global_rdfs,current_rdfs;int maxfd;int i,opt = 1;char buf[MAXLINE];int nbyte;int a[10] = {0};int num = 0;int socklen = sizeof(myaddr);char buf1[MAXLINE] = "server : ";if((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0){perror("socket error");exit(-1);}if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)) < 0){perror("setsockopt error");exit(-1);}bzero(&myaddr,sizeof(myaddr));myaddr.sin_family = AF_INET;myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");myaddr.sin_port = htons(8888);if(bind(listenfd,(SA*)&myaddr,sizeof(myaddr)) < 0){perror("bind error");exit(-1);}listen(listenfd,5);FD_ZERO(&global_rdfs);FD_SET(STDIN_FILENO,&global_rdfs);FD_SET(listenfd,&global_rdfs);maxfd = listenfd;while(1){current_rdfs = global_rdfs;if(select(maxfd+1,¤t_rdfs,NULL,NULL,0) < 0){perror("select error");exit(-1);}else{for(i = 0;i<=maxfd;i++){if(FD_ISSET(i,¤t_rdfs)){if(i == listenfd){a[num] = accept(listenfd,(SA*)&myaddr,&socklen);FD_SET(a[num],&global_rdfs);maxfd = maxfd>a[num]?maxfd:a[num];num++;}else {if((nbyte = recv(i,buf,sizeof(buf),0)) <=0){close(i);FD_CLR(i,&global_rdfs);}else{int j = 0;for(j = 0;j<10;j++){if(a[j] != 0)send(a[j],buf,sizeof(buf),0);}}}}}}}}
客户端#include <stdio.h>#include <stdlib.h>#include <netinet/in.h>#include <string.h>#include<arpa/inet.h>#include <unistd.h>#include <sys/select.h>#include <sys/types.h>#include <sys/time.h>#define MAX 50typedef struct sockaddr SA;typedef struct sockaddr_in SA_IN;int main (int argc ,char ** argv){ int sockfd,connfd; SA_IN servaddr; fd_set global_rdfs,current_rdfs; int maxfd; int i,nbyte; char buf[MAX]; if ((sockfd =socket(AF_INET,SOCK_STREAM,0))<0) { perror("socket error"); exit(-1); } bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=inet_addr("127.0.0.1"); servaddr.sin_port=htons(8888); if(connect(sockfd,(SA *)&servaddr,sizeof(servaddr))<0) { perror("connect error"); exit(-1); } FD_ZERO(&global_rdfs); FD_SET(STDIN_FILENO,&global_rdfs); FD_SET(sockfd,&global_rdfs); maxfd =sockfd; while (1) { current_rdfs=global_rdfs; if(select(maxfd+1,¤t_rdfs,NULL,NULL,0)<0) { perror("select error"); exit(-1); } else { for (i=0 ;i<=maxfd;i++) { if(FD_ISSET(i,¤t_rdfs)) { if( i==0) { fgets(buf,sizeof(buf),stdin); send(sockfd,buf,sizeof(buf),0); } else if(i==sockfd) { if((nbyte=recv(sockfd,buf,sizeof(buf),0))<0) { close (i); FD_CLR(i,&global_rdfs); } else { printf("client is %s\n",buf); } } } } } } return 0;}