当前位置: 首页 > news >正文

【高性能服务器】单进程服务器

🔥博客主页: 我要成为C++领域大神
🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️

本博客致力于知识分享,与更多的人进行学习交流

单进程服务器

处理流程:

1、客户端发送请求

2、服务端处理请求

3、服务端发送响应

4、客户端接收响应

使用单进程服务器测试业务:

客户端向标准输入发送小写字符串,服务端响应回复对应大写字符,"abcAS"->"ABCAS"

客户端向服务端发送关键字localtime,服务端响应回复系统时间、

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>
#include <time.h>#define _SERVER_IP "xxx.xxx.xxx.xxx"//这里修改为你服务器的IP地址
#define _PORT 8080
#define _BACKLOG 128
#define _SHUTDOWN 1
#define _TRUE 1
#define _FALSE 0
#define _IPSIZE 16
#define _RECVLEN 1500int main()
{int recvlen;struct sockaddr_in serverAddr,clientAddr;int server_fd;int client_fd;char Result[_RECVLEN];char client_ip[_IPSIZE];socklen_t Addrlen;serverAddr.sin_family=AF_INET;serverAddr.sin_port=htons(_PORT);serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);server_fd=socket(AF_INET,SOCK_STREAM,0);bind(server_fd,(struct sockaddr*)&serverAddr,sizeof(serverAddr));listen(server_fd,_BACKLOG);printf("Test TCP Server Version 1.1.0 is Running...\n");time_t tp;char time_buf[100];//存放当前系统时间int toupper_flag;while(_SHUTDOWN){Addrlen=sizeof(clientAddr);if((client_fd=accept(server_fd,(struct sockaddr*)&clientAddr,&Addrlen))>0){//Socket通信bzero(Result,sizeof(Result));bzero(client_ip,sizeof(client_ip));inet_ntop(AF_INET,&clientAddr.sin_addr.s_addr,client_ip,_IPSIZE);printf("Connection From :IP[%s],PORT[%d]\n",client_ip,ntohs(clientAddr.sin_port));sprintf(Result,"Hi [%s] Welcome to my TCP test server!service version 1.1.0...",client_ip);send(client_fd,Result,strlen(Result),0);//读取用户数据1,如果用户发的是普通小写字符字符串,转换为大写,如果发送的是local关键字,响应时间bzero(Result,sizeof(Result));//持续响应,循环读写while((recvlen=recv(client_fd,Result,sizeof(Result),0))>0){printf("Client Say:%s\n",Result);if(strcmp(Result,"localtime")==0){tp=time(NULL);//获取时间种子ctime_r(&tp,time_buf);time_buf[strcspn(time_buf,"\n")]='\0';printf("[%s]Response SysTime Successfully!\n",client_ip);send(client_fd,time_buf,strlen(time_buf)+1,0);}else{toupper_flag=0;while(recvlen>toupper_flag){Result[toupper_flag]=toupper(Result[toupper_flag]);++toupper_flag;}printf("[%s]Response Toupper Successfully!\n",client_ip);send(client_fd,Result,recvlen,0);}}close(client_fd);}else{perror("accpet failed");close(server_fd);exit(0);}}close(server_fd);return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>//客户端源码编写,连接服务器成功,服务器反馈信息#define _IP "xxx.xxx.xxx.xxx"//这里修改为你服务器的IP地址
#define _PORT 8080
int main()
{struct sockaddr_in ServerAddr;bzero(&ServerAddr,sizeof(ServerAddr));ServerAddr.sin_family=AF_INET;ServerAddr.sin_port=htons(_PORT);inet_pton(AF_INET,_IP,&ServerAddr.sin_addr.s_addr);int Myfd=socket(AF_INET,SOCK_STREAM,0);//看需求决定是否要绑定char Response[1024];//存放服务端反馈信息ssize_t recvlen;bzero(Response,sizeof(Response));if((connect(Myfd,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr)))==0){if((recvlen=recv(Myfd,Response,sizeof(Response),0))>0){printf("%s\n",Response);}}else{printf("Connect failed\n");close(Myfd);exit(0);}close(Myfd);printf("Client is Over\n");return 0;
}

完成了大小写转换,系统时间的响应:

当再打开一个终端:因为只有一个进程响应客户端,所以新的客户端进程被阻塞了。只有上一个进程退出,新的客户端进程才能连接

缺点:一次只能处理一个客户端

http://www.lryc.cn/news/386980.html

相关文章:

  • 任意密码重置漏洞
  • synchronized关键字和ReentrantLock在不同jdk版本中性能哪个高?该怎么选择呢?
  • 【旭日x3派】部署官方yolov5全流程
  • java LinkedList 怎么保证线程安全
  • uniapp+vue3开发微信小程序踩坑集
  • 办公软件WPS与Office的区别
  • [数据集][目标检测]睡岗检测数据集VOC+YOLO格式3290张4类别
  • 使用Java编写网络爬虫
  • 生鲜水果行业wordpress主题
  • 3.3V到5V的负电源产生电路(电荷泵电压反相器)SGM3204输出电流0.2A封装SOT23-6
  • Excel 宏录制与VBA编程 —— 15、MsgBox参数详解
  • Kafka~消息发送过程与ISR机制了解
  • multiprocessing.Queue 多个进程生产和多个进程消费怎么处理
  • 配置 Python 解释器及虚拟环境
  • JeecgBoot中如何对敏感信息进行脱敏处理?
  • 【Docker】存储数据卷
  • 《昇思25天学习打卡营第12天 | 昇思MindSpore基于MindSpore的GPT2文本摘要》
  • 深入解析npm unpublish命令:使用场景与实践指南
  • 有趣的仿神经猫html5圈小猫游戏源码
  • Redis 7.x 系列【10】数据类型之有序集合(ZSet)
  • 操作系统-文件的物理结构(文件分配方式)
  • Spring Boot集成jsoup实现html解析
  • [240629] 阿里云揭秘其数据中心设计和自研网络,用于大语言模型训练 | Jina AI 发布最新的神经网络重排序模型
  • 【Docker0】网络更改
  • IDEA中导入Maven项目
  • px、em、rem、rpx 作用和用法详解
  • Linux 常用命令 - dd 【复制及转换文件内容】
  • 全网唯一免费无水印AI视频工具!
  • kafka(四)消息类型
  • Emacs之显示blame插件:blamer、git-messenger(一百四十四)