计算机网络-服务器模型

一.服务器模型

1.支持多客户端访问

//单循环服务器

socket

bind

listen

while(1)

{

accept

while(1)

{

recv/send

}

}

close

注:该模式remvform为阻塞态,服务器将等待接收数据

2..支持多客户端同时访问 (并发能力)

socket

bind

listen

while(1)

{

connf = accept

pid_t pid = fork();

//出错处理

if (pid == 0)

{

while(1) //负责 与 客户端通信的

{

recv/send

}

}

}

close

注:将管道设置成非阻塞一直读取

读端设置非阻塞

//线程

void *handle_client(void *arg)

{

while(1) //子线程中 负责 与 客户端通信的

{

recv/send

}

}

socket

bind

listen

while(1)

{

connf = accept

pthread_create();

//出错处理

}

close

二,三种服务器模型:

1.单循环服务器

2.并发服务器

进程

线程

1、简单循环服务器

http

web 服务器,apache--》cgi,php,perl,IIS--》asp,NGIX,Nlighty

while(1)

{

newfd = accept();

recv();

close(newfd);

}

特点:可以接入多个客户端的信息。

缺点:数据通信过程短,客户端只能一次有效。

实时性效果差。

2、fork循环服务器===>每次有链接则fork一个子进程为该

链接处理通信过程,父进程继续等待新链接。

while(1)

{

newfd = accept();

pid = fork()

if(pid == 0)

{

///接收数据

}

if(pid < 0)

{

perror("fork");

return -1;

}

waitpid()

}

特点:可以完成多个进程的实时交互,信息的完整性可以保证。

缺点:回收资源不方便,每次fork 占用系统资源多。

可能出现僵尸进程

多线程:

特点:

创建速度快,调度快

缺点:

线程共享进程资源,稳定性,安全性 较差

3.并发的服务器模型 ---更高程度上的并发

IO模型

阻塞IO

非阻塞IO

1、阻塞IO

用的最多。

读阻塞。

写阻塞。

2、非阻塞IO

-1 errno EAGAIN whild(1){read()break;}忙等待

contro

注:信号驱动IO

4.SELECT函数并发

#include <unistd.h>

#include <fcntl.h>

int fcntl(int fd, int cmd, ... /* arg */ );

功能:修改指定文件的属性信息。

参数:fd 要调整的文件描述符

cmd 要调整的文件属性宏名称

... 可变长的属性值参数。

返回值:成功 不一定,看cmd

失败 -1;

int fcntl(int fd, int cmd, ... /* arg */ );

//驱动:

//1.驱动程序 ---- 驱使硬件工作起来的程序

让灯亮起来

//2.应用程序

应用程序

led_ctnl(led_fd,ON );

led_ctnl(led_fd,OFF );

led_ctnl(led_ctnl,STREAM); //流水灯

eg:修改文件的非阻塞属性:

int flag ;

flag = fcntl(fd,F_GETFL,0); ///获取fd文件的默认属性到flag变量中。

flag = flag | O_NONBLOCK; ///将变量的值调整并添加非阻塞属性

fcntl(fd,F_SETFL,flag); ///将新属性flag设置到fd对应的文件生效。

以上代码执行后的阻塞IO将变成非阻塞方式。

相关推荐
!沧海@一粟!6 分钟前
麒麟Zabbix Agent安装配置全攻略
linux·服务器·zabbix
鸠摩智首席音效师4 小时前
如何使用 docker exec 在容器中运行命令 ?
运维·docker·容器
似水এ᭄往昔4 小时前
【Linux】自动化构建-make/Makefile
linux·运维·服务器·ubuntu
顶点多余5 小时前
Linux“信号“从硬件到软件详解
linux·运维·服务器
勘察加熊人5 小时前
ai飞卢小说自动化处理工作流获得提问素材
运维·自动化
瀚高PG实验室6 小时前
rpm包安装报错:cannot open Packages index using db5 - Cannot allocate memory (12)
linux·运维·服务器·瀚高数据库
云计算老刘6 小时前
2. DNS 服务器
运维
水星灭绝6 小时前
win11+wsl2+docker
运维·docker·容器
追风少年王大爷丶6 小时前
nginx 配置无域名访问拒绝
运维·服务器·nginx
black方块cxy6 小时前
实现一个输入框多个ip以逗号分隔最多20组,且ip不能重复
java·服务器·前端