多路复用(select 群回发)

来源:互联网 发布:搞基漫画软件 编辑:程序博客网 时间:2024/05/22 16:44
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;}


原创粉丝点击