📄 server.c
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/select.h>#include <pthread.h>#define MAXLINE 1024fd_set all_set, ready_set;int client[FD_SETSIZE];int maxfd, max_client;pthread_mutex_t mutex;void add_new_client(int listenfd){ struct sockaddr_in cli; socklen_t clilen = sizeof(cli); int i, fd; char str[INET_ADDRSTRLEN]; fd = accept(listenfd, (struct sockaddr *)&cli, &clilen); for (i=0; i<FD_SETSIZE; i++) if (client[i]==-1) break; if (i==FD_SETSIZE) { printf("Too many clients\n"); exit(0); } printf("New client from %s at port %d\n", inet_ntop(PF_INET, &cli.sin_addr, str, sizeof(str)), ntohs(cli.sin_port)); client[i] = fd; if (i>max_client) max_client = i; FD_SET(fd, &all_set); if (fd>maxfd) maxfd = fd;}void *client_thread(void *arg){ char buf[MAXLINE]; int fd = *((int*)arg); int i, len; if (read(fd, buf, MAXLINE)) { printf("receive from client %d: %s", fd, buf); len = strlen(buf); for (i=0; i<len; i++) buf[i] = toupper(buf[i]); write(fd, buf, len+1); } else { printf("client %d closed\n", fd); close(fd); pthread_mutex_lock(&mutex); FD_CLR(fd, &all_set); *((int*)arg) = -1; pthread_mutex_unlock(&mutex); } return NULL;}void serve_client(){ pthread_t tid[FD_SETSIZE]; int i, nthread=0; for (i=0; i<=max_client; i++) { if (client[i]==-1) continue; if (!FD_ISSET(client[i], &ready_set)) continue; pthread_create(&tid[nthread++], NULL, client_thread, &client[i]); } for (i=0; i<nthread; i++) pthread_join(tid[i], NULL);}int main(){ struct sockaddr_in serv; int listenfd; int i, opt=1, nready; pthread_mutex_init(&mutex, NULL); bzero(&serv, sizeof(serv)); serv.sin_family = PF_INET; serv.sin_port = htons(8000); serv.sin_addr.s_addr = htonl(INADDR_ANY); listenfd = socket(PF_INET, SOCK_STREAM, 0); setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); bind(listenfd, (struct sockaddr *)&serv, sizeof(serv)); listen(listenfd, 1024); printf("Accepting connection...\n"); FD_ZERO(&all_set); FD_SET(listenfd, &all_set); maxfd = listenfd; max_client = -1; for (i=0; i<FD_SETSIZE; i++) client[i] = -1; while (1) { ready_set = all_set; nready = select(maxfd+1, &ready_set, NULL, NULL, NULL); if (FD_ISSET(listenfd, &ready_set)) { add_new_client(listenfd); nready--; } if (nready) serve_client(); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -