Linux回射服务器(一):多进程实现并发
来源:互联网 发布:oracle有mac版吗 编辑:程序博客网 时间:2024/06/01 07:53
建立连接后创建一个进程来处理每个连接
使用fork()函数创建子进程
服务器端:
#include<sys/types.h>#include<sys/socket.h>#include<stdio.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>#include<string.h>#include<stdlib.h>#include<fcntl.h>#include<sys/shm.h>#include<signal.h>#include<errno.h>#define MYPORT 9877 //服务器端口#define QUEUE 20 //等待队列大小#define BUFFER_SIZE 1024 //缓冲区大小int main(){ //定义socket int server_sockfd = socket(AF_INET,SOCK_STREAM,0); //定义sockaddr_in struct sockaddr_in server_sockaddr; server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(MYPORT); server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); //bind,成功返回0,出错返回-1 if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1) { perror("bind error!\n"); exit(1); } //lisen,成功返回0,出错返回-1 if(listen(server_sockfd,QUEUE)==-1) { perror("lisen error!\n"); exit(1); } int count=0; while(1) { //客户端套接字 char buffer[BUFFER_SIZE]; struct sockaddr_in client_addr; socklen_t length = sizeof(client_addr); //接收连接 成功返回非负描述字,出错返回-1 int conn = accept(server_sockfd,(struct sockaddr*)&client_addr,&length); if(conn<0) { if(errno==EINTR) { continue; } perror("connect error!\n"); exit(1); } int pid; //调用fork()函数时 如果是父进程调用则返回进程号,如果是子进程调用则返回0 //这里父进程用来创建连接 子进程负责处理请求 所以当pid=0才执行 if((pid=fork())==0) { //子进程会复制父进程的资源 这里我们关闭连接只是把子进程复制的连接关闭并不会真正关闭连接 close(server_sockfd); while(1) { //清空缓冲区 memset(buffer,0,sizeof(buffer)); //接收客户端发送来的数据 int len = recv(conn,buffer,sizeof(buffer),0); if(strcmp(buffer,"exit\n")==0||len==0) { break; } fputs(buffer,stdout); //把相同的数据发送给客户端 send(conn,buffer,len,0); } close(conn); exit(0); } close(conn); count++; } close(server_sockfd); return 0;}
客户端:
#include<sys/types.h>#include<sys/socket.h>#include<stdio.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>#include<string.h>#include<stdlib.h>#include<fcntl.h>#include<sys/shm.h>#define MYPORT 9877#define BUFFER_SIZE 1024int main(){ //定义socket int sock_cli = socket(AF_INET,SOCK_STREAM,0); //定义sockaddr_in struct sockaddr_in servaddr; memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(MYPORT); servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //连接服务器,成功返回0,出错返回-1 if(connect(sock_cli,(struct sockaddr*)&servaddr,sizeof(servaddr))<0) { error("connect error!\n"); exit(1); } char sendbuf[BUFFER_SIZE]; char recvbuf[BUFFER_SIZE]; memset(sendbuf,0,sizeof(sendbuf)); memset(recvbuf,0,sizeof(recvbuf)); while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL) { send(sock_cli,sendbuf,strlen(sendbuf),0); if(strcmp(sendbuf,"exit\n")==0) { break; } recv(sock_cli,recvbuf,sizeof(recvbuf),0); fputs(recvbuf,stdout); memset(sendbuf,0,sizeof(sendbuf)); memset(recvbuf,0,sizeof(recvbuf)); } close(sock_cli); return 0;}
这里基本就实现了并发的回射服务器
不过也有可能出现一些问题
比如当我们客户端运行过程中我们非正常关闭客户端(ctrl+c结束程序)我们会发现对应的负责处理请求的服务器端进程仍然在运行成为僵死进程。下面一篇博客将会描述如何处理这种情况
0 0
- Linux回射服务器(一):多进程实现并发
- linux(一)------多进程并发服务器实现(fork)
- 多进程实现并发服务器
- linux socket多进程并发服务器
- linux网络编程多进程并发服务器
- linux网络编程多进程并发服务器
- Linux TCP多进程并发服务器
- Linux TCP协议使用进程实现并发服务器
- Linux之并发进程服务器
- 多进程并发服务器
- 并发服务器---多进程
- Linux并发服务器实现
- Linux Shell实现多进程并发执行
- Linux Shell实现多进程并发执行
- epoll+socket实现并发服务器 Linux C(版本一)
- 实现TCP并发服务器之一(多进程)
- FIFO实现并发服务器——多进程
- 聊聊Linux fork多进程并发服务器模型
- Python自动化拉取Mysql数据并装载到Hive
- TP--民生组合名称乱码问题解决
- 设计模式之单例模式(一)
- Redis安装
- OkHttp3网络协议的使用
- Linux回射服务器(一):多进程实现并发
- php 百度地图api接入
- ODBC API开发——初学
- 基于Spring CommonsMultipartResolver批量上传文件
- 关于 Apache Maven 您不知道的 5 件事
- 我是怎么招聘程序员的
- Android 异步加载解决方案
- Navicat常用快捷键
- Java设计模式