多进程、多线程并发服务器代码
2016-09-08 20:37
381 查看
1.单进程服务器:
2.单客户端
3.多进程服务器
4.多个客户端(一段代码产生多个客户端)
1.当时编写这段代码的作用是撑爆老师的服务器
#include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<strings.h> #include<ctype.h> #include<arpa/inet.h> #include<unistd.h> #define SERV_PORT 8888 int std_err(const char* name) { perror(name); exit(1); } int main(void) { int sfd, cfd, ret; int len; socklen_t clie_len; char buf[BUFSIZ]; //创建服务器套节字 sfd = socket(AF_INET, SOCK_STREAM, 0); if(sfd == -1) std_err("socket"); //定义地址类型 struct sockaddr_in serv_addr, clie_addr; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(SERV_PORT); serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //绑定服务器的IP、端口; ret = bind(sfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); if(ret == -1) std_err("bind"); //监听链接服务器的客户数量 ret = listen(sfd, 99); if(ret == -1) std_err("listen"); clie_len = sizeof(clie_addr); //阻塞等待客户端发起链接请求 cfd = accept(sfd, (struct sockaddr*)&clie_addr, &clie_len); if(cfd == -1) std_err("accept"); //传输数据 while(1) { len = read(cfd, buf, sizeof(buf)); printf("server: %s\n", buf); int i; for(i = 0; i < len; i++) buf[i] = toupper(buf[i]); write(cfd, buf, len); } close(sfd); close(cfd); return 0; }
2.单客户端
#include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<strings.h> #include<ctype.h> #include<arpa/inet.h> #include<unistd.h> #define SERV_PORT 8888 int std_err(const char* name) { perror(name); exit(1); } int main(void) { int cfd, ret, serv_IP; char buf[BUFSIZ]; //创建套节字 cfd = socket(AF_INET, SOCK_STREAM, 0); if(cfd == -1) std_err("socket"); //定义IP , 端口 struct sockaddr_in clie_addr; clie_addr.sin_family = AF_INET; clie_addr.sin_port = htons(SERV_PORT); //转换IP 字符串的地址 ret = inet_pton(AF_INET, "192.168.22.251", &serv_IP); if(ret != 1) std_err("inet_pton"); clie_addr.sin_addr.s_addr = serv_IP; //链接服务器 ret = connect(cfd, (struct sockaddr*)&clie_addr, sizeof(clie_addr)); if(ret == -1) std_err("connect"); // 传输数据 while(1) { int len = read(STDIN_FILENO, buf, sizeof(buf)); printf("cliet_len: %d\n", len); write(cfd, buf, len); len = read(cfd, buf, sizeof(buf)); printf("serve_len: %d\n", len); printf("%s",buf); //write(STDOUT_FILENO, buf, len); } //关闭套节字 close(cfd); return 0; }
3.多进程服务器
#include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<strings.h> #include<ctype.h> #include<arpa/inet.h> #include<unistd.h> #include<errno.h> #include<sys/wait.h> #include<errno.h> #define SERV_PORT 8883 int std_err(const char* name) { perror(name); exit(1); } void do_sth_child(int signum) { while(waitpid(0, NULL, WNOHANG) < 0) ; } int main(void) { int sfd, cfd, ret; int len; pid_t pid; socklen_t clie_len; char buf[BUFSIZ], clibuf[32]; //创建服务器套节字 sfd = socket(AF_INET, SOCK_STREAM, 0); if(sfd == -1) std_err("socket"); //定义地址类型 struct sockaddr_in serv_addr, clie_addr; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(SERV_PORT); serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //绑定服务器的IP、端口; ret = bind(sfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); if(ret == -1) std_err("bind"); //监听链接服务器的客户数量 ret = listen(sfd, 99); if(ret == -1) std_err("listen"); clie_len = sizeof(clie_addr); while(1) { //阻塞等待客户端发起链接请求 cfd = accept(sfd, (struct sockaddr*)&clie_addr, &clie_len); printf("client IP :%s, port: %d\n", inet_ntop(sfd, &clie_addr.sin_addr.s_addr, clibuf, sizeof(clibuf)), ntohs(clie_addr.sin_port) ); if(cfd == -1) std_err("accept"); pid = fork(); if(pid < 0) std_err("fork:"); else if(pid == 0) { close(sfd); break; } else //住进程实现逻辑;1.回收子进程,2,关闭不必要的文件描述父 3,继续等待客户端链接,如果有,则继续创建子进程 { close(cfd); signal(SIGCHLD, do_sth_child); } } if(pid == 0) { agian: //子进程传输数据 while(1) { len = read(cfd, buf, sizeof(buf)); if(len == 0) //即客户端关闭通信, { close(cfd); exit(1); } else if( len == -1) { if(errno == EINTR) { goto agian; } else { std_err("read:"); } } else { int i; for(i = 0; i < len; i++) buf[i] = toupper(buf[i]); write(cfd, buf, len); write(STDOUT_FILENO, buf, len); } } } return 0; }
4.多个客户端(一段代码产生多个客户端)
1.当时编写这段代码的作用是撑爆老师的服务器
#include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<strings.h> #include<ctype.h> #include<arpa/inet.h> #include<unistd.h> #include<sys/wait.h> #include<signal.h> #include<errno.h> #include<pthread.h> #include <pthread.h> #define SERV_PORT 8883 #define SERV_IP "127.0.0.1" int std_err(const char* name) { perror(name); exit(1); } void do_sth_child(int signum) { while(waitpid(0, NULL, WNOHANG) > 0); } int main(void) { int cfd, ret; char buf[BUFSIZ]; pid_t pid; //pthread_mutexattr_t mattr; //pthread_mutexattr_init(&mattr); //pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED); //pthread_mutex_t mutex; //pthread_mutex_init(&mutex, &mattr); int i; for(i = 0; i < 6; i++){ pid = fork(); if(pid == 0) break; else if(pid < 0) std_err("fork"); else { // close(cfd); signal(SIGCHLD, do_sth_child); } } //子进程逻辑 if(pid == 0) { //创建套节字 cfd = socket(AF_INET, SOCK_STREAM, 0); if(cfd == -1) std_err("socket"); //定义IP , 端口 struct sockaddr_in clie_addr; clie_addr.sin_family = AF_INET; clie_addr.sin_port = htons(SERV_PORT); //转换IP 字符串的地址 ret = inet_pton(AF_INET, SERV_IP, &clie_addr.sin_addr.s_addr); if(ret != 1) std_err("inet_pton"); //pthread_mutex_lock(&mutex); //链接服务器 ret = connect(cfd, (struct sockaddr*)&clie_addr, sizeof(clie_addr)); if(ret == -1) std_err("connect"); // 传输数据 // while(1) { int len; again: //char bufstr[10] = "sdasdasd"; len = read(STDIN_FILENO, buf, sizeof(buf)); if(len < 0) { if(errno == EAGAIN || errno == EINTR) goto again; else std_err("read"); } write(cfd, buf, len); //write(cfd, bufstr, sizeof(bufstr)); //len = read(cfd, buf, sizeof(buf)); //printf("serve_len: %d\n", len); //printf("%s",buf); write(STDOUT_FILENO, buf, len); } //pthread_mutex_unlock(&mutex); } while(1); //关闭套节字 close(cfd); return 0; }
相关文章推荐
- 多进程、多线程并发服务器代码
- 几种并发服务器模型的实现:多线程,多进程,select,poll,epoll - rail
- 网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?
- 怎么理解并发多进程服务和多线程服务器
- Linux:多进程、多线程服务器的实现解析(有图有代码有真相!!!)
- 几种并发服务器模型的实现:多线程,多进程,select,poll,epoll
- 网络编程中设计并发服务器,使用多进程与多线程有什么区别?
- select服务器端的代码以及select的优缺点与多线程多进程服务器的比较
- 设计并发服务器,使用多进程与多线程有什么区别?
- 怎么理解并发多进程服务和多线程服务器
- 几种并发服务器模型的实现:多线程,多进程,select,poll,epoll
- Linux网络编程使用多进程实现服务器并发访问
- 搭建一个后台服务器--服务端代码(异步,大并发)
- 常见多线程与并发服务器设计方案举例
- 常见多线程与并发服务器设计方案举例
- 利用CAS机制实现多进程,多线程下的无锁并发控制
- 进程和线程的区别、多进程与多线程、并行与并发、多任务
- 高性能高并发服务器架构浅析--多线程模式
- 并发危险-解决多线程代码中的11个常见的问题
- 多线程与并发服务器设计(23 - 2 )