网络编程_day6

目录

【0】复习

并发服务器实现思路梳理

多进程

多线程

IO多路复用select

【1】setsockopt:设置套接字属性

socket属性

设置地址重用

【2】超时检测

必要性

超时检测的设置方法

1. 通过函数自带的参数设置

2. 通过设置套接字属性进行设置

3. alarm函数与sigaction函数结合

【3】广播与组播(broadcast & multicast)

1. 广播(udp)

理论:

发送者

接收者

缺点:

2. 组(多)播(udp)

理论

发送者

接收者

【4】本地套接字

特性

流程(tcp为例)

客户端

服务器


【0】复习

linux IO模型:阻塞IO、非阻塞IO、信号驱动IO

IO多路复用(并发):select(特点)、poll(特点)、epoll(特点)

服务器模型:循环服务器(一个服务器在同一时间只能处理一个客户端的请求)、

并发服务器(一个服务器在同一时可以处理多个客户端的请求)(多进程、多线程、IO多路复用select)

并发服务器实现思路梳理

多进程

多进程实现并发
并发:一个服务器可以同时连接多个客户端(同时与多个客户端通信)
什么时间创建多进程?accept之后fork
父:accept----》阻塞
fork
子:recv----》阻塞利用信号SIGCHLD进行回收子进程资源handler()
{
waitpid();
}main()
{socket();bind();listen();signal(SIGCHLD,handler); while(1){accept();pid=fork();if(pid==0){while(1)recvexit();}elseclose();}}

多线程

多线程实现并发
什么时间创建多线程?
主:accept
创建线程pthread_create
子:recv
如果把accept函数的返回值定义为全局变量,那么acceptfd会是最后一次链接的客户端的用于通信的文件描述符handler(void*)
{
//类型准换int acceptfd=*((int *)arg);while(1)recv();
}main()
{socket();bind();listen();while(1){acceptfd=accept();//传参pthread_create(handler,&acceptfd);pthread_detach();}
}

IO多路复用select

select:一张文件描述符的表
将关心的文件描述符添加到表中,内核监听,当内核监听的表中有文件描述符产生事件,未发生事件的文件描述符会清0,select返回,我们需要判断到底是哪一个或者哪些文件描述符发生了事件,最对应的逻辑处理main
{sockfd=socket();bind();listen();有表;FD_ZERO();FD_SET(sockfd);while(1){// 一定要注意,要有备份表//备份表:保留关心的文件描述符,确保不会被select修改select();if(FD_ISSET(sockfd))acceptfd=accept();FD_SET(acceptfd);//从原表添加for(int i=sockfd+1;i<=max;i++){if(FD_ISSET(i))ret=recv(i);if(ret==0)FD_CLR(i);//从原表删除}}
}

【1】setsockopt:设置套接字属性

set:设置 sock:套接字 option:属性

int setsockopt(int sockfd,int level,int optname,void *optval,socklen_t optlen)
功能:获得/设置套接字属性
参数:
sockfd:套接字描述符
level:协议层
optname:选项名
optval:选项值
optlen:选项值大小
返回值:     成功 0                  失败-1

socket属性

int 类型中 允许则为1或其他值 , 不允许则为0

选项名称

说明

数据类型

========== SOL_SOCKET 应用层 ===========

SO_BROADCAST

允许发送广播数据

int

SO_DEBUG

允许调试

int

SO_DONTROUTE

不查找路由

int

SO_ERROR

获得套接字错误

int

SO_KEEPALIVE

保持连接

int

SO_LINGER

延迟关闭连接

struct linger

SO_OOBINLINE

带外数据放入正常数据流

int

SO_RCVBUF

接收缓冲区大小

int

SO_SNDBUF

发送缓冲区大小

int

SO_RCVLOWAT

接收缓冲区下限

int

SO_SNDLOWAT

发送缓冲区下限

int

SO_RCVTIMEO

接收超时

struct timeval

SO_SNDTIMEO

发送超时

struct timeval

SO_REUSEADDR

允许重用本地地址和端口

int

SO_TYPE

获得套接字类型

int

SO_BSDCOMPAT

与BSD系统兼容

int

========== IPPROTO_IP IP层/网络层 =============

IP_HDRINCL

在数据包中包含IP首部

int

IP_OPTINOS

IP首部选项

int

IP_TOS

服务类型

int

IP_TTL

生存时间

int

IP_ADD_MEMBERSHIP

将指定的IP加入多播组

struct ip_mreq

========== IPPRO_TCP 传输层 ============

TCP_MAXSEG

TCP最大数据段的大小

int

TCP_NODELAY

不使用Nagle算法

int

 

 

设置地址重用

 

【2】超时检测

必要性

  1. 避免进程进入无限制的阻塞
  2. 在规定的时间内未完成相应的语句,可以执行其他的语句

超时检测的设置方法

1. 通过函数自带的参数设置

select poll

2. 通过设置套接字属性进行设置

3. alarm函数与sigaction函数结合

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
功能:对接收到的指定信号处理
参数:signum:要捕获的信号act:接收到信号之后对信号进行处理的结构体oldact:接收到信号之后,保存原来对此信号处理的各种方式与信号(可用来做备份)。如果不需要备份,此处可以填NULL
struct sigaction 
{void     (*sa_handler)(int); //信号处理函数void     (*sa_sigaction)(int, siginfo_t *, void *);  //查看信号的各种详细信息sigset_t   sa_mask;int        sa_flags;      //信号属性; SA_RESTART自重启属性
#define SA_RESTART  0x10000000void     (*sa_restorer)(void);//不再使用};     //设置信号属性struct sigaction act;sigaction(SIGALRM,NULL,&act);//获取原属性act.sa_handler=handler;//修改属性sigaction(SIGALRM,&act,NULL);//将修改的属性设置回去
返回值:成功:0出错:-1,并将errno设置为指示错误

 

【3】广播与组播(broadcast & multicast)

1. 广播(udp)

理论:

前面介绍的数据包发送方式只有一个接受方,称为单播

如果同时发给局域网中的所有主机,称为广播

只有用户数据报(使用UDP协议)套接字才能广播

一般被设计成局域网搜索协议

● 广播地址:局域网中主机号最大的一个 192.168.50.255

发送者

  1. 创建数据报套接字
  2. 由于原本的套接字不允许广播,所以要设置广播属性
  3. 指定网络信息(接收者)
  4. 发送消息
  5. 关闭套接字

 

接收者

  1. 创建数据报套接字
  2. 指定网络信息(接收者)
  3. 绑定套接字
  4. 接收消息
  5. 关闭套接字

缺点:

    广播方式发给所有的主机,过多的广播会大量的占用网络带宽,造成广播风暴,影响正常的通信

广播风暴: 网络长时间被大量的广播数据包所占用,使正常的点对点通信无法正常进行,其外在表现为网络速度奇慢无比,甚至导致网络瘫痪

2. 组(多)播(udp)

理论

单播方式只能发给一个接收方。

广播方式发给所有的主机。过多的广播会大量占用网络带宽,造成广播风暴,影响正常的通信。

播是一个人发送,加入到多播组的人接收数据。

多播方式既可以发给多个主机,又能避免像广播那样带来过多的负载(每台主机要到传输层才能判断广播包是否要处理)

 D类:224.0.0.0-239.255.255.255

发送者

  1. 创建数据报套接字
  2. 指定网络信息(接收者)
  3. 发送消息
  4. 关闭套接字

接收者

  1. 创建数据报套接字
  2. 设置多播属性,将自己的IP加入到多播组中
  3. 指定网络信息(接收者)
  4. 绑定套接字
  5. 接收消息
  6. 关闭套接字

 

 

【4】本地套接字

特性

  1. socket同样可以用于本地间进程通信,创建套接字时使用本地协议AF_LOCAL或AF_UNIX
  2. 分为流式套接字和数据报套接字
  3. 和其他进程间通信相比使用方便、效率更高,常用于前后台进程通信。

流程(tcp为例)

客户端

  1. socket()
  2. struct sockaddr_un
  3. connect
  4. send
  5. close

 

服务器

  1. socket()
  2. struct sockaddr_un
  3. bind
  4. listen
  5. accept
  6. recv
  7. close

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/459815.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT-Sovits-1-数据处理

1.1 切割音频 将音频切割为多个10s内的片段 1.2 降噪 这一步用的是modelscope的pipeline 如果要去除背景音&#xff0c;可以用傅立叶转为为频谱&#xff0c;去除低频部分后再转回来 1.3 提取音频特征 这里用到了 funasr 库 这一步目的是输出音频样本的《文本标签文件》&am…

Linux——常见指令及其权限理解(正在更新中)

1.指令 1.1 快速了解指令 pwd 首次登录&#xff0c;默认所处的路径 whoami 当前所用的用户的名称 ls 显示当前路径下&#xff0c;文件名称 mkdir 在当前目录下&#xff0c;创建一个文件夹/目录 cd 进入一个目录 touch 新建一个文…

Kafka 物理存储机制

优质博文&#xff1a;IT-BLOG-CN 一个商业化消息队列的性能好坏&#xff0c;其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一。下面将从Kafka文件存储机制和物理结构角度&#xff0c;分析Kafka是如何实现高效文件存储&#xff0c;及实际应用效果。Kafka的基…

采用STM32CubeMX和HAL库的定时器应用实例

目录 STM32的通用定时器配置流程 定时器应用的硬件设计 定时器应用的软件设计 1. 通过STM32CubeMX新建工程 通过STM32CubeMX新建工程的步骤如下&#xff1a; 2. 通过Keil MDK实现工程 通过Keil MDK实现工程的步骤如下&#xff1a; STM32的通用定时器配置流程 通用定时器…

【优选算法篇】前缀之序,后缀之章:于数列深处邂逅算法的光与影

文章目录 C 前缀和详解&#xff1a;基础题解与思维分析前言第一章&#xff1a;前缀和基础应用1.1 一维前缀和模板题解法&#xff08;前缀和&#xff09;图解分析C代码实现易错点提示代码解读题目解析总结 1.2 二维前缀和模板题解法&#xff08;二维前缀和&#xff09;图解分析C…

Topaz Video AI for Mac 视频无损放大软件安装教程【保姆级,操作简单轻松上手】

Mac分享吧 文章目录 Topaz Video AI for Mac 视频无损放大软件 安装完成&#xff0c;软件打开效果一、Topaz Video AI 视频无损放大软件 Mac电脑版——v5.3.5⚠️注意事项&#xff1a;1️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件&#xff0c;将安装包从左侧拖入右侧文…

CNAS软件测试的好处有哪些?上海软件测试中心推荐

在进行软件测试或其他项目检测需要选择软件测试中心时&#xff0c;我们常常会把该公司有无资质认证考虑进去。那么CNAS认可作为检测机构或实验室的一项重要资质认证&#xff0c;我们可能会产生疑问&#xff1a;CNAS认可什么意思?CNAS软件测试又有什么好处呢? 1、CNAS认可是什…

【51 Pandas+Pyecharts | 深圳市共享单车数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 处理起始时间、结束时间2.4 增加骑行时长区间列2.5 增加骑行里程区间列 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 各…

AMBA之AXI 总线

AMBA概述 AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;是ARM公司开发的一种高级微控制器总线架构&#xff0c;用于连接处理器、存储器和外设的通信。AMBA总线架构定义了一组协议和接口&#xff0c;用于实现高性能、低功耗、可扩展的系统设计。 AM…

Amcor 如何借助 Liquid UI 实现SAP PM可靠性

背景介绍 安姆科是塑料行业的全球领军企业&#xff0c;该企业认识到 SAP 工厂维护&#xff08;SAP PM&#xff09;对于确保高效的维护管理的重要性。 在诸如制造业等高度依赖机械设备的行业中&#xff0c;SAP PM是一种通过数据驱动决策来最大限度减少停机时间、降低间接成本、…

【C语言】预处理(预编译)详解(下)(C语言最终篇)

文章目录 一、#和##1.#运算符2.##运算符 二、预处理指令#undef三、条件编译1.单分支条件编译2.多分支条件编译3.判断符号是否被定义4.判断符号是否没有被定义 四、头文件的包含1.库头文件的包含2.本地头文件的包含3.嵌套包含头文件的解决方法使用条件编译指令使用预处理指令#pr…

宠物空气净化器哪个牌子好?有没有噪音低的宠物空气净化器推荐?

如今随着社会竞争越来越激烈&#xff0c;不少人开始焦虑内耗&#xff0c;但为了能更好的生活&#xff0c;养宠物便成为不少人的排忧解乏的方法。 我也不例外&#xff0c;作为一名996社畜&#xff0c;天刚亮就出门&#xff0c;天黑很久才回家&#xff0c;所以选择养猫来陪我度过…

C++设计模式创建型模式———生成器模式

文章目录 一、引言二、生成器/建造者模式三、总结 一、引言 上一篇文章我们介绍了工厂模式&#xff0c;工厂模式的主要特点是生成对象。当对象较简单时&#xff0c;可以使用简单工厂模式或工厂模式&#xff1b;而当对象相对复杂时&#xff0c;则可以选择使用抽象工厂模式。 工…

创作三周年:在忙碌中寻找灵感与快乐

目录 机缘 收获 技能的提升 粉丝的积累 正向的反馈 同行的伙伴 日常 运动 旅行 生活 憧憬 结语 机缘 不知不觉已经成为创作者3年了&#xff0c;这一路走来&#xff0c;有过高峰和低谷&#xff0c;但始终让我坚持的&#xff0c;是最初那份简单的初心&#xff1a;我…

C#从零开始学习(用户界面)(unity Lab4)

这是书本中第四个unity Lab 在这次实验中,将学习如何搭建一个开始界面 分数系统 点击球,会增加分数 public void ClickOnBall(){Score;}在OneBallBehaviour类添加下列方法 void OnMouseDown(){GameController controller Camera.main.GetComponent<GameController>();…

分布式搜索引擎elasticsearch操作文档操作介绍

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;…

软件系统安全保证措施,质量保证措施方案(Word原件套用)

系统安全保证措施是构建稳固防御体系的核心&#xff0c;旨在全方位保障信息系统的安全性。以下是对这七项措施的简要概述&#xff1a; 一、身份鉴别&#xff1a;采用多种认证方式&#xff0c;如密码、生物识别等&#xff0c;确保用户身份的准确无误&#xff0c;防止非法入侵。 …

玩转Docker | 使用Docker部署捕鱼网页小游戏

玩转Docker | 使用Docker部署捕鱼网页小游戏 一、项目介绍项目简介项目预览 二、系统要求环境要求环境检查Docker版本检查检查操作系统版本 三、部署捕鱼网页小游戏下载镜像创建容器检查容器状态下载项目内容查看服务监听端口安全设置 四、访问捕鱼网页小游戏五、总结 一、项目…

局域网 docker pull 使用代理拉取镜像

局域网 docker pull 使用代理拉取镜像 1、需求&#xff1a; 我有win主机&#xff0c;上面装有代理可连接dockerhub&#xff1b;我另有linux主机&#xff0c;直接pull因墙失败&#xff0c;想走win的代理访问dockerhub拉镜像&#xff1b;两台主机在同一个局域网中&#xff1b; …

c语言中结构体传参和实现位段

结构体传参 有两种方法: #include<stdio.h> struct S {int data[1000];int num; }; //结构体传参 void print1(struct S s) {printf("%d\n",s.num); } //结构体地址传参 void print2(struct S *ps) {printf("%d\n",ps->num); }int main() {pr…