📄 server_thread.c
字号:
/*该服务器采用的实现方法是多线程,在这里面有一个主线程,用它来临
听是否有连接,每当有连接是它就会生成一个子线程来处理客户端的请求,
处理完后子线程退出*/
#include<string.h>#include<stdlib.h>#include<stdio.h>#include<strings.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<pthread.h>#define PORT 1234#define BACKLOG 5#define MAXDATASIZE 1000void process_cli(int connectfd, sockaddr_in client);void *start_routine(void *arg);typedef struct ARG { int connfd;sockaddr_in client;};main(){int listenfd, connectfd;pthread_t thread;ARG *arg;struct sockaddr_in server;struct sockaddr_in client;socklen_t sin_size;if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)//创建套接字{perror("Creating socket failed.");exit(1);}int opt = SO_REUSEADDR;setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));//设置地址可重用bzero(&server, sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(PORT);server.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1)//绑定{perror("Bind fail.");exit(1);}if (listen(listenfd, BACKLOG) == -1)//监听{perror("listen fail");exit(1);}sin_size = sizeof(struct sockaddr_in);while (1){ if ((connectfd = accept(listenfd, (struct sockaddr *)&client, &sin_size)) == -1){ //连接
if (error == EINTR)
continue;perror("accept fail.");exit(1);}arg =(ARG *)malloc(sizeof(ARG));//此时为处理子线程分配一个结构,采用动态分配是为了避免之间的干扰arg->connfd = connectfd;memcpy((void *)&arg->client, &client, sizeof(client));if (pthread_create(&thread, NULL, start_routine, (void *)arg))//每有连接到来就创建一个线程来处理它{perror("Pthread_creart fail.");exit(1);}}close(listenfd);}void process_cli(int connectfd, sockaddr_in clien){int num;char recvbuf[MAXDATASIZE];char sendbuf[MAXDATASIZE];char cli_name[MAXDATASIZE];printf("You got a connection from %s.", inet_ntoa(clien.sin_addr));num = recv(connectfd, cli_name, MAXDATASIZE, 0);
if (num == 0){close(connectfd);printf("Client disconnected.\n");return;}cli_name[num - 1] = '\0';printf("Client's name is %s.\n", cli_name);while (num = recv(connectfd, recvbuf, MAXDATASIZE, 0)){
if (error = EINTR)
continue;recvbuf[num] = '\0';printf("Received client(%s) message:%s", cli_name , recvbuf);int i;for (i=0; i<num-1; i++){sendbuf[i] = recvbuf[num - i - 2];}sendbuf[num - 1] = '\0';send(connectfd, sendbuf, strlen(sendbuf), 0);}close(connectfd);}void *start_routine(void *arg){ARG *info;info = (ARG *)arg;process_cli(info->connfd, info->client);free(arg);pthread_exit(NULL);//子线程处理完后退出来}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -