linux socket多路复用服务器

来源:互联网 发布:优质三坐标编程 编辑:程序博客网 时间:2024/06/04 17:57
/************client**********/ #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #define PORT 1234  #define SERVER_IP "127.0.0.1" main() { int s; struct sockaddr_in addr; char buffer[256]; static int flag = 1;  if((s = socket(AF_INET,SOCK_STREAM,0))<0)  { perror("socket"); exit(1); }  /* 填写sockaddr_in结构*/  bzero(&addr,sizeof(addr));  addr.sin_family = AF_INET;  addr.sin_port=htons(PORT); addr.sin_addr.s_addr = inet_addr(SERVER_IP); /* 尝试连线*/ if(connect(s,&addr,sizeof(addr))<0)  {  perror("connect"); exit(1); }  /* 接收由server端传来的信息*/  recv(s,buffer,sizeof(buffer),0);  printf("%s\n",buffer); while(1) { bzero(buffer,sizeof(buffer)); /* 从标准输入设备取得字符串*/ if (flag == 1) read(STDIN_FILENO,buffer,sizeof(buffer));  printf("Insert data:%s\n", buffer); flag = 0; 
} else { read(s,buffer,sizeof(buffer)); printf("From sever: %d\n\n", buffer[0]); }  /* 将字符串传给server端*/ sleep(2); buffer[0] += 1; if(write(s,buffer,sizeof(buffer))<0) { perror("send"); exit(1); } printf("To sever: %d\n", buffer[0]); } }   /***************sever*************/ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <sys/select.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define PORT 1234 #define MAXSOCKFD 10 void main() {  int sockfd,newsockfd,is_connected[MAXSOCKFD],fd; struct sockaddr_in addr; int addr_len = sizeof(struct sockaddr_in);  fd_set readfds;  char buffer[256];  char msg[ ] ="Welcome to server!"; if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0)  { perror("socket"); exit(1);  }  bzero(&addr,sizeof(addr));  addr.sin_family =AF_INET;  addr.sin_port = htons(PORT);  addr.sin_addr.s_addr = htonl(INADDR_ANY); //addr.sin_addr.s_addr = inet_addr(SERVER_IP);  if(bind(sockfd,&addr,sizeof(addr))<0) { perror("connect"); exit(1); }  if(listen(sockfd,3)<0) { perror("listen"); exit(1); }   for(fd=0;fd<MAXSOCKFD;fd++) is_connected[fd]=0; while(1) { FD_ZERO(&readfds); FD_SET(sockfd,&readfds); for(fd=0;fd<MAXSOCKFD;fd++) { if(is_connected[fd]) FD_SET(fd,&readfds); } /*阻塞,如果文件描述符没有改变*/  if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL)) { continue; }    for(fd=0;fd<MAXSOCKFD;fd++) { if(FD_ISSET(fd,&readfds)) {  printf("sockfd = %d, fd = %d\n", sockfd, fd); /*两个描述符相等时表示有新的客户端连接到达*/ 
if(sockfd ==fd) { if((newsockfd = accept (sockfd,&addr,&addr_len))<0) perror("accept"); write(newsockfd,msg,sizeof(msg)); printf("newsockfd = %d\n", newsockfd);  is_connected[newsockfd] =1; printf("cnnect from %s\n",inet_ntoa(addr.sin_addr)); } else { bzero(buffer,sizeof(buffer)); if(read(fd,buffer,sizeof(buffer))<=0) { printf("connect closed.\n"); is_connected[fd]=0; close(fd); } else { printf("From client: %d\n",buffer[0]); if (write(fd, buffer, strlen(buffer)) < 0) perror("write");
printf("To client: %d\n\n",buffer[0]); } }  
} } }  }  

原创粉丝点击