⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server_thread.c

📁 用Unix下的socket实现的并发服务器
💻 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 + -