首页 > 代码库 > 多进程、多线程并发服务器代码
多进程、多线程并发服务器代码
1.单进程服务器:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<sys/types.h> 4 #include<sys/socket.h> 5 #include<string.h> 6 #include<strings.h> 7 #include<ctype.h> 8 #include<arpa/inet.h> 9 #include<unistd.h>10 11 #define SERV_PORT 888812 13 int std_err(const char* name)14 {15 perror(name);16 exit(1);17 }18 19 int main(void)20 {21 int sfd, cfd, ret;22 int len;23 socklen_t clie_len;24 char buf[BUFSIZ];25 //创建服务器套节字26 sfd = socket(AF_INET, SOCK_STREAM, 0);27 if(sfd == -1)28 std_err("socket");29 //定义地址类型30 struct sockaddr_in serv_addr, clie_addr;31 serv_addr.sin_family = AF_INET;32 serv_addr.sin_port = htons(SERV_PORT);33 serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);34 35 //绑定服务器的IP、端口;36 ret = bind(sfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));37 if(ret == -1)38 std_err("bind");39 40 //监听链接服务器的客户数量41 ret = listen(sfd, 99);42 if(ret == -1)43 std_err("listen");44 clie_len = sizeof(clie_addr);45 //阻塞等待客户端发起链接请求46 cfd = accept(sfd, (struct sockaddr*)&clie_addr, &clie_len);47 if(cfd == -1)48 std_err("accept");49 50 //传输数据51 while(1)52 {53 len = read(cfd, buf, sizeof(buf));54 printf("server: %s\n", buf);55 int i;56 for(i = 0; i < len; i++)57 buf[i] = toupper(buf[i]);58 write(cfd, buf, len);59 }60 close(sfd);61 close(cfd);62 return 0;63 }
2.单客户端
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<sys/types.h> 4 #include<sys/socket.h> 5 #include<string.h> 6 #include<strings.h> 7 #include<ctype.h> 8 #include<arpa/inet.h> 9 #include<unistd.h>10 11 #define SERV_PORT 888812 13 int std_err(const char* name)14 {15 perror(name);16 exit(1);17 }18 19 int main(void)20 {21 int cfd, ret, serv_IP;22 char buf[BUFSIZ];23 //创建套节字24 cfd = socket(AF_INET, SOCK_STREAM, 0);25 if(cfd == -1)26 std_err("socket");27 //定义IP , 端口28 struct sockaddr_in clie_addr;29 clie_addr.sin_family = AF_INET;30 clie_addr.sin_port = htons(SERV_PORT);31 //转换IP 字符串的地址32 ret = inet_pton(AF_INET, "192.168.22.251", &serv_IP);33 if(ret != 1)34 std_err("inet_pton");35 clie_addr.sin_addr.s_addr = serv_IP;36 //链接服务器37 ret = connect(cfd, (struct sockaddr*)&clie_addr, sizeof(clie_addr));38 if(ret == -1)39 std_err("connect");40 // 传输数据41 while(1)42 {43 int len = read(STDIN_FILENO, buf, sizeof(buf));44 printf("cliet_len: %d\n", len);45 46 write(cfd, buf, len);47 len = read(cfd, buf, sizeof(buf));48 printf("serve_len: %d\n", len);49 printf("%s",buf);50 //write(STDOUT_FILENO, buf, len); 51 }52 //关闭套节字53 close(cfd);54 return 0;55 56 }
3.多进程服务器
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<sys/types.h> 4 #include<sys/socket.h> 5 #include<string.h> 6 #include<strings.h> 7 #include<ctype.h> 8 #include<arpa/inet.h> 9 #include<unistd.h> 10 #include<errno.h> 11 #include<sys/wait.h> 12 #include<errno.h> 13 14 #define SERV_PORT 8883 15 16 int std_err(const char* name) 17 { 18 perror(name); 19 exit(1); 20 } 21 22 void do_sth_child(int signum) 23 { 24 25 while(waitpid(0, NULL, WNOHANG) < 0) 26 ; 27 28 } 29 30 int main(void) 31 { 32 int sfd, cfd, ret; 33 int len; 34 pid_t pid; 35 socklen_t clie_len; 36 char buf[BUFSIZ], clibuf[32]; 37 //创建服务器套节字 38 sfd = socket(AF_INET, SOCK_STREAM, 0); 39 if(sfd == -1) 40 std_err("socket"); 41 //定义地址类型 42 struct sockaddr_in serv_addr, clie_addr; 43 serv_addr.sin_family = AF_INET; 44 serv_addr.sin_port = htons(SERV_PORT); 45 serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 46 47 //绑定服务器的IP、端口; 48 ret = bind(sfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 49 if(ret == -1) 50 std_err("bind"); 51 52 //监听链接服务器的客户数量 53 ret = listen(sfd, 99); 54 if(ret == -1) 55 std_err("listen"); 56 clie_len = sizeof(clie_addr); 57 while(1) 58 { 59 //阻塞等待客户端发起链接请求 60 cfd = accept(sfd, (struct sockaddr*)&clie_addr, &clie_len); 61 printf("client IP :%s, port: %d\n", 62 inet_ntop(sfd, &clie_addr.sin_addr.s_addr, clibuf, sizeof(clibuf)), 63 ntohs(clie_addr.sin_port) ); 64 if(cfd == -1) 65 std_err("accept"); 66 pid = fork(); 67 if(pid < 0) 68 std_err("fork:"); 69 else if(pid == 0) 70 { 71 close(sfd); 72 break; 73 } 74 else //住进程实现逻辑;1.回收子进程,2,关闭不必要的文件描述父 3,继续等待客户端链接,如果有,则继续创建子进程 75 { 76 close(cfd); 77 signal(SIGCHLD, do_sth_child); 78 } 79 } 80 if(pid == 0) 81 { 82 agian: 83 //子进程传输数据 84 while(1) 85 { 86 len = read(cfd, buf, sizeof(buf)); 87 if(len == 0) //即客户端关闭通信, 88 { 89 close(cfd); 90 exit(1); 91 } 92 else if( len == -1) 93 { 94 if(errno == EINTR) 95 { 96 goto agian; 97 } 98 else 99 {100 std_err("read:");101 }102 }103 else104 {105 int i;106 for(i = 0; i < len; i++)107 buf[i] = toupper(buf[i]);108 write(cfd, buf, len);109 write(STDOUT_FILENO, buf, len);110 }111 }112 }113 114 return 0;115 }
4.多个客户端(一段代码产生多个客户端)
1.当时编写这段代码的作用是撑爆老师的服务器
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<sys/types.h> 4 #include<sys/socket.h> 5 #include<string.h> 6 #include<strings.h> 7 #include<ctype.h> 8 #include<arpa/inet.h> 9 #include<unistd.h> 10 #include<sys/wait.h> 11 #include<signal.h> 12 #include<errno.h> 13 #include<pthread.h> 14 #include <pthread.h> 15 16 17 #define SERV_PORT 8883 18 #define SERV_IP "127.0.0.1" 19 int std_err(const char* name) 20 { 21 perror(name); 22 exit(1); 23 } 24 void do_sth_child(int signum) 25 { 26 while(waitpid(0, NULL, WNOHANG) > 0); 27 } 28 29 int main(void) 30 { 31 int cfd, ret; 32 char buf[BUFSIZ]; 33 pid_t pid; 34 //pthread_mutexattr_t mattr; 35 //pthread_mutexattr_init(&mattr); 36 //pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED); 37 //pthread_mutex_t mutex; 38 //pthread_mutex_init(&mutex, &mattr); 39 40 int i; 41 for(i = 0; i < 6; i++){ 42 pid = fork(); 43 if(pid == 0) 44 break; 45 else if(pid < 0) 46 std_err("fork"); 47 else 48 { 49 // close(cfd); 50 signal(SIGCHLD, do_sth_child); 51 } 52 } 53 54 //子进程逻辑 55 if(pid == 0) 56 { 57 //创建套节字 58 cfd = socket(AF_INET, SOCK_STREAM, 0); 59 if(cfd == -1) 60 std_err("socket"); 61 //定义IP , 端口 62 struct sockaddr_in clie_addr; 63 clie_addr.sin_family = AF_INET; 64 clie_addr.sin_port = htons(SERV_PORT); 65 //转换IP 字符串的地址 66 ret = inet_pton(AF_INET, SERV_IP, &clie_addr.sin_addr.s_addr); 67 if(ret != 1) 68 std_err("inet_pton"); 69 //pthread_mutex_lock(&mutex); 70 //链接服务器 71 ret = connect(cfd, (struct sockaddr*)&clie_addr, sizeof(clie_addr)); 72 if(ret == -1) 73 std_err("connect"); 74 // 传输数据 75 // while(1) 76 { 77 int len; 78 again: 79 //char bufstr[10] = "sdasdasd"; 80 len = read(STDIN_FILENO, buf, sizeof(buf)); 81 if(len < 0) 82 { 83 if(errno == EAGAIN || errno == EINTR) 84 goto again; 85 else 86 std_err("read"); 87 } 88 write(cfd, buf, len); 89 //write(cfd, bufstr, sizeof(bufstr)); 90 //len = read(cfd, buf, sizeof(buf)); 91 //printf("serve_len: %d\n", len); 92 //printf("%s",buf); 93 write(STDOUT_FILENO, buf, len); 94 } 95 //pthread_mutex_unlock(&mutex); 96 } 97 while(1); 98 //关闭套节字 99 close(cfd);100 return 0;101 102 }
多进程、多线程并发服务器代码
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。