/* For sockaddr_in */ #include <netinet/in.h> /* For socket functions */ #include <sys/socket.h> /* For fcntl */ #include <fcntl.h> /* for select */ #include <sys/select.h> #include <assert.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> typedef struct _CLIENT { //客户端结构体 int fd; //客户端socket描述符 } CLIENT; int main(int argc, char** argv) { int listener; int connectfd; fd_set readset, writeset, exset; struct sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_addr.s_addr = 0; sin.sin_port = htons(40713); listener = socket(AF_INET, SOCK_STREAM, 0); fcntl(listener, F_SETFL, O_NONBLOCK); if (bind(listener, (struct sockaddr*)&sin, sizeof(sin)) < 0) { perror("bind"); return; } if (listen(listener, 16)<0) { perror("listen"); return; } FD_ZERO(&readset); FD_ZERO(&writeset); FD_ZERO(&exset); CLIENT client_array[FD_SETSIZE]; int maxfd = listener; while (1) { struct sockaddr_in addr; FD_ZERO(&readset); FD_ZERO(&writeset); FD_ZERO(&exset); // FD_SET(listener, &readset); int i; for( i = listener+1; i< maxfd+1; i++) { if (client_array[i].fd != 0) { FD_SET(client_array[i].fd, &readset); FD_SET(client_array[i].fd, &writeset); FD_SET(client_array[i].fd, &exset); } } if (select(maxfd+1, &readset, &writeset, &exset, NULL) < 0) { perror("select"); return; } if (FD_ISSET(listener, &readset)) { int sin_size = sizeof(addr); connectfd = accept(listener, (struct sockaddr *)&addr, (socklen_t *) &sin_size); printf("get a new client:%d....\n", connectfd); client_array[connectfd].fd = connectfd; if (connectfd > maxfd) { maxfd = connectfd; } } for( i = listener+1; i< maxfd+1; i++) { if (FD_ISSET(client_array[i].fd, &readset)) { // read someting char recvbuff[200] = {0}; int len = recv(client_array[i].fd, recvbuff, 200, 0); if (len > 0) { recvbuff[len] = '\0'; printf("recv:%s\n",recvbuff); } else { printf("socket closed\n"); close(client_array[i].fd); client_array[i].fd = 0; } } if (FD_ISSET(client_array[i].fd, &writeset)) { // write someting if (send(client_array[i].fd, "bye\r\n", strlen("bye\r\n"), 0) < 0) { printf("socket closed\n"); close(client_array[i].fd); client_array[i].fd = 0; } sleep(1); } if (FD_ISSET(client_array[i].fd, &exset)) { // exception close(client_array[i].fd); client_array[i].fd = 0; printf("error occures!"); } } } }
select 模式
最新推荐文章于 2023-08-24 21:09:11 发布