【高性能服务器】单进程服务器
🔥博客主页: 我要成为C++领域大神
🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️
本博客致力于知识分享,与更多的人进行学习交流
单进程服务器
处理流程:
1、客户端发送请求
2、服务端处理请求
3、服务端发送响应
4、客户端接收响应
使用单进程服务器测试业务:
客户端向标准输入发送小写字符串,服务端响应回复对应大写字符,"abcAS"->"ABCAS"
客户端向服务端发送关键字localtime,服务端响应回复系统时间、
服务端:
#include
#include
#include
#include
#include
#include
#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 1500
int 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
#include
#include
#include
#include
#include
//客户端源码编写,连接服务器成功,服务器反馈信息
#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;
}
完成了大小写转换,系统时间的响应:
当再打开一个终端:因为只有一个进程响应客户端,所以新的客户端进程被阻塞了。只有上一个进程退出,新的客户端进程才能连接
缺点:一次只能处理一个客户端
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!




