计算机网络-服务器模型

一.服务器模型

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将变成非阻塞方式。

相关推荐
ayaya_mana31 分钟前
Docker常见问题与解决
运维·docker·容器
数据皮皮侠1 小时前
中国绿色制造企业数据(绿色工厂|绿色供应链|绿色园区|绿色产品,2017-2023)
大数据·运维·服务器·人工智能·制造·微信开放平台
王家视频教程图书馆2 小时前
关于docker pull不了相关资源
运维·docker·容器
wheeldown3 小时前
【Linux&&vs code】Xshell远程配置到VS Code环境配置指南
linux·运维·服务器
江湖有缘3 小时前
【Docker项目实战】使用Docker部署IT运维管理平台CAT
运维·docker·eureka
阿雄不会写代码5 小时前
AWS | Linux 硬盘挂载综合教程
linux·运维·chrome
basketball6167 小时前
13. 初识 NVMe over RDMA
服务器·网络·nvme
@小蜗牛8 小时前
pycharm+raidrive+autodl
服务器·深度学习·pycharm
李迟9 小时前
2025年9月个人工作生活总结
服务器·数据库·生活
Lin_Aries_042110 小时前
容器化 Tomcat 应用程序
java·linux·运维·docker·容器·tomcat