Linux各种并发服务器优缺点

embedded/2024/11/28 2:19:15/

本文旨在介绍针对“无并发C/S模型”改进的方法总结以及各种改进方法的优缺点,具体函数的实现并不介绍。

 

1. 无并发C/S模型

创建服务器流程分析:

  1. socket()创建服务器的监听套接字
  2. bind()将服务器服务器的监听套接字绑定IP地址和Port端口号
  3. listen()设置服务器端能够连接客户端的最大连接数。默认128
  4. accept()阻塞等待客户端连接,连接成功之后,系统默认创建新的用于与客户端进行数据交换的套接字,accept()返回该数据通信套接字的文件描述符
  5. 与客户端进行数据交换
  6. close()关闭服务器端的俩个套接字
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <errno.h>
#include <ctype.h>
#include <arpa/inet.h>
#define SERV_PORT 9527void sys_err(const char *str){perror(str);exit(1);
}int main(int argc, char *argv[]){int lfd = 0 ,cfd = 0;int ret,i;int buf[BUFSIZ]; //BUFSIZ==4096struct sockaddr_in serv_addr;//初始化地址结构体,并给其分配IP和端口号serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(SERV_PORT);serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址自动获取struct sockaddr_in clit_addr; //accept()的传出参数socklen_t clit_addr_len; //accept()的传入传出参数lfd = socket(AF_INET,SOCK_STREAM,0);//1.服务器端创建套接字if (lfd == -1)sys_err("socket error");bind(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); //2.bind给服务器套接字分配地址listen(lfd,128); //3. 设置服务器端最大连接客户端请求上限clit_addr_len = sizeof(clit_addr);//accept()调用成功的话, clit_addr会保存客户端的地址结构, clit_addr_len保存长度cfd = accept(lfd,(struct sockaddr *)&clit_addr, &clit_addr_len);if (cfd == -1)sys_err("accept error");//服务器与客户端建立连接成功----数据通信while(1){ret = read(cfd,buf,sizeof(buf));write(STDOUT_FILENO,buf,ret);for (i = 0; i < ret; i++)buf[i] = toupper(buf[i]);write(cfd,buf,ret);}close(lfd);close(cfd);return 0;
}

创建客户端流程分析:

  1. socket()创建套接字
  2. 【bind()给套接字分配IP地址】此步骤可有可无,不调用bind的话系统自动分配
  3. connect()与请求连接服务器
  4. 服务器进行数据通信
  5. close()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define SERV_PORT 9527
void sys_err(const char *str){perror(str);exit(1);
}int main(int argc, char *argv[]){int cfd;struct sockaddr_in serv_addr; // 服务器的地址结构serv_addr.sin_family = AF_INET;serv_addr.sin_port =htons(SERV_PORT);//存储网络字节序格式的端口号   inet_pton(AF_INET,"127.0.0.1",&serv_addr.sin_addr.s_addr);//存储网络字节序的IP地址cfd = socket(AF_INET,SOCK_STREAM,0);//1.创建socket套接字if (cfd == -1)sys_err("socket error");int ret = connect(cfd,(struct sockaddr *)&serv_addr, sizeof(serv_addr));//2.与服务器套接字建立连接if (ret != 0)sys_err("connect err");int counter = 10;char buf[BUFSIZ];while(--counter){//通信write(cfd,"hello",5);//写“hello”到缓冲区ret = read(cfd,buf,sizeof(buf));//读缓冲区内容到buf中,注意,read是阻塞读取的write(STDOUT_FILENO,buf,ret);}close(cfd);
}

数据通信:

  1. 运行./server
  2. 运行./client, 成功完成数据通信
  3. 再次运行client,此时无法通信

无并发C/S模型模型缺点:

运行server后,accpet只调用了一次,因此当一个client发出连接请求,accpet便不再监听,而是与客户端建立连接,开始通信,无法做到一个server程序同时与多个client通信

2. 多进程C/S模型

3. 多线程C/S模型

4. select模型

5. select多线程模型

6. poll模型

poll的参数:

fds:监听的文件描述符【数组】,该数组的每个成员是struct pollfd

nfds: 监听数组的实际有效监听个数

7. epoll模型


http://www.ppmy.cn/embedded/141065.html

相关文章

java虚拟机——频繁发生Full GC的原因有哪些?如何避免发生Full GC

什么是Full GC Full GC&#xff08;Full Garbage Collection&#xff09;是Java垃圾收集过程中的一种形式&#xff0c;它涉及整个堆内存&#xff08;包括年轻代和老年代&#xff09;以及方法区的垃圾收集。Full GC是一个相对重量级的操作&#xff0c;因为它需要遍历和回收整个…

Spring Boot英语知识网站:开发策略

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 英语知识应用网站的系统管理员可以对用户信息添加修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 在线学习管理 系统管理员可以对在线学习信息进行添加&#xff0c;修改&#xff0…

ASP.NET Web(.Net Framework) Http服务器搭建以及IIS站点发布

ASP.NET Web&#xff08;.Net Framework&#xff09; Http服务器搭建以及IIS站点发布 介绍创建ASP.NET Web &#xff08;.Net Framework&#xff09;http服务器创建项目创建脚本部署Http站点服务器测试 Get测试编写刚才的TestWebController.cs代码如下测试写法1测试写法2 Post测…

快速简单的视频下载器——lux

文章目录 前言1.环境检查1.1 检查 lux 安装1.2 检查FFmpeg安装1.3 备注 2. lux指令2.1 无OPTIONS2.2 -i 指令2.3 - f 指令2.4 -c 指令2.5 -o 指令2.6 备注 3.结语 前言 在学习之余&#xff0c;发现了一个简单并且高效的视频下载器lux,能够帮你快速且高效的下载文件&#xff08…

Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch客户端在和集群连接时&#xff0c;如何选择特定的节点执行请求的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch客户端在和集群连接时&#xff0c;如何选择特定的节点执行请求的&#xff1f; 100…

自主研发,基于PHP+ vue2+element+ laravel8+ mysql5.7+ vscode开发的不良事件管理系统源码,不良事件管理系统源码

不良事件上报系统源码&#xff0c;不良事件管理系统源码&#xff0c;PHP源码 不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”&#xff0c;结合预存上百套已正在使用的模板&#xff0…

双向链表、循环链表、栈

双向循环链表 class Node:#显性定义出构造函数def __init__(self,data):self.data data #普通节点的数据域self.next None #保存下一个节点的链接域self.prior None #保存前一个节点饿链接域 class DoubleLinkLoop:def __init__(self, node Node):self.head nodeself.siz…

关于“内网可以访问21端口,通过防火墙映射后无法访问”的问题解决

如果内网可以访问21端口&#xff0c;但通过防火墙映射后无法访问&#xff0c;这通常是因为防火墙或路由器的配置问题。以下是一些可能的解决方案和检查步骤&#xff1a; 1. 检查防火墙映射配置 确保你的防火墙或路由器已经正确配置了端口映射。通常&#xff0c;你需要将外部端…