1 #include<unistd.h> 2 #include<stdio.h> 3 #include<sys/select.h> 4 #include<sys/socket.h> 5 #include<netinet/in.h> 6 #include<string.h> 7 #include<stdlib.h> 8 #include<assert.h> 9 10 #define SERVER_IP "127.0.0.1" 11 #define SERVER_PORT 9090 12 13 #define LISTEN_QUEUE_SIZE 5 14 15 void Perror(char *error) 16 { 17 perror(error); 18 exit(1); 19 } 20 21 int Startup(char *ip, short port) 22 { 23 int sockfd = socket(AF_INET, SOCK_STREAM, 0); 24 if(sockfd == -1) 25 Perror("socket"); 26 27 short ser_port = port; 28 char *ser_ip = ip; 29 30 struct sockaddr_in addrSer; 31 addrSer.sin_family = AF_INET; 32 addrSer.sin_port = htons(ser_port); 33 addrSer.sin_addr.s_addr = inet_addr(ser_ip); 34 35 36 int yes = 1; 37 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); 38 39 socklen_t len = sizeof(struct sockaddr); 40 int res = bind(sockfd, (struct sockaddr*)&addrSer, len); 41 if(res == -1) 42 Perror("bind"); 43 res = listen(sockfd, LISTEN_QUEUE_SIZE); 44 if(res == -1) 45 Perror("listen"); 46 47 return sockfd; 48 } 49 50 51 ye
1 #include"utili.h" 2 3 //select ip port 4 5 #define MAX_CLIENT_NUM 50000 6 7 void handler_msg(int sockConn) 8 { 9 char buffer[256]; 10 recv(sockConn, buffer, 256, 0); 11 printf("cli msg:> %s\n",buffer); 12 send(sockConn, buffer, strlen(buffer)+1, 0); 13 } 14 15 16 17 int main(int argc, char *argv[]) 18 { 19 assert(argc == 3); 20 short port = atoi(argv[2]); 21 int sockSer = Startup(argv[1], port); 22 23 int client_fd[MAX_CLIENT_NUM] = {0}; 24 fd_set readset; 25 26 int max_sock = sockSer; 27 int conn_num = 0; 28 int i; 29 while(1) 30 { 31 FD_ZERO(&readset); 32 FD_SET(sockSer, &readset); 33 for(i=0; i<MAX_CLIENT_NUM; ++i) 34 { 35 if(client_fd[i] != 0) 36 { 37 FD_SET(client_fd[i], &readset); 38 } 39 } 40 printf("select waiting......\n"); 41 int res = select(max_sock+1, &readset, NULL, NULL, NULL); 42 printf("select wakeup.......\n"); 43 if(res == -1) 44 { 45 perror("select"); 46 continue; 47 } 48 else if(res == 0) 49 { 50 printf("select Time Out.\n"); 51 continue; 52 } 53 else 54 { 55 //1 56 if(FD_ISSET(sockSer, &readset)) 57 { 58 struct sockaddr_in addrCli; 59 socklen_t len = sizeof(struct sockaddr); 60 int sockConn = accept(sockSer, (struct sockaddr*)&addrCli, &len); 61 if(sockConn == -1) 62 { 63 printf("Server Accept Client Connect Fail.\n"); 64 } 65 else 66 { 67 printf("Server Accept Client Connect OK.\n"); 68 client_fd[conn_num++] = sockConn; 69 70 if(sockConn > max_sock) 71 max_sock = sockConn; 72 } 73 continue; 74 } 75 76 for(i=0; i<conn_num; ++i) 77 { 78 if(FD_ISSET(client_fd[i], &readset)) 79 { 80 handler_msg(client_fd[i]); 81 } 82 } 83 } 84 85 } 86 87 return 0; 88 }
时间: 2024-12-18 18:23:16