多进程多线程并发服务器代码

Posted 路之遥_其漫漫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多进程多线程并发服务器代码相关的知识,希望对你有一定的参考价值。

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 8888
12 
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 8888
12 
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             else
104             {
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 }

 

以上是关于多进程多线程并发服务器代码的主要内容,如果未能解决你的问题,请参考以下文章

多进程多线程并发服务器代码

多个用户访问同一段代码

php socket多进程简单服务器

python并发编程中的多进程(代码实现)

多线程

python 并发编程 多线程 守护线程