udp多点通信和心跳包

刷题

# UDP多点通信核心要点
## 基础通信模式
### 单播通信
- 一对一通信方式
- UDP默认通信模式
- 地址指向具体目标主机
### 广播通信
- 一对多通信机制
- 地址范围:`xxx.xxx.xxx.255`
- 仅限局域网传输
- 需设置SO_BROADCAST标志
### 组播通信
- 多对多群组通信
- 地址范围:224.0.0.0~239.255.255.255
- 需加入组播IP(IP_ADD_MEMBERSHIP)
## 核心函数配置
### setsockopt参数
#### 通用配置
- `SO_REUSEADDR`:端口复用
- `SO_RCVTIMEO`:接收超时
- `SO_SNDTIMEO`:发送超时
#### 广播配置
- `SO_BROADCAST`:广播权限
- 绑定地址:`255.255.255.255`
#### 组播配置
- `IP_ADD_MEMBERSHIP`:加入组播
- `struct ip_mreqn`结构体:
```c
struct ip_mreqn {
struct in_addr imr_multiaddr; // 组播IP
struct in_addr imr_address; // 本地IP
int imr_ifindex; // 网络接口索引
};

通信实现逻辑

广播服务器

  1. 创建DGRAM套接字
  2. 绑定广播地址或0.0.0.0
  3. 设置SO_REUSEADDR
  4. 循环接收数据

组播客户端

  1. 创建DGRAM套接字
  2. 加入组播组(IP_ADD_MEMBERSHIP)
  3. 绑定组播IP地址
  4. 接收群组消息

特殊处理机制

超时控制

  • 接收超时结构体:
    struct timeval {
    __kernel_time_t tv_sec; // 秒
    __kernel_suseconds_t tv_usec; // 微秒
    };

错误检测

  • 返回值检测:
    • recvfrom返回0表示空数据包
    • EAGAIN错误处理非阻塞状态
    • 发送失败重试机制

通信限制对比

特性单播广播组播
地址范围具体IP255结尾地址224-239网段
跨路由器支持不支持支持
适用场景精准传输局域网通知群组通信
资源消耗中等

代码结构示例

组播接收端

// 加入组播组
struct ip_mreqn mreq;
mreq.imr_multiaddr.s_addr = inet_addr("224.1.2.3");
mreq.imr_address.s_addr = inet_addr("192.168.1.100");
mreq.imr_ifindex = 0;
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

广播发送端

// 启用广播权限
int broadcast = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast));

# 心跳包核心要点
## 基本概念
- **定义**:用于维持长连接的活跃状态,防止网络设备断开空闲连接
- **核心目的**:
- 检测客户端存活状态
- 避免防火墙/NAT误判连接失效
## 实现机制
### 时间戳维护
- **客户端**:发送业务消息或心跳包时更新最后通信时间
- **服务端**:
- 接收消息后更新时间戳
- 维护客户端列表(IP+Port+最后通信时间)
### 心跳包发送
- **周期触发**:客户端每30秒发送空数据包
- **信号机制**:
```c
signal(SIGALRM, handler); // 注册ALRM信号处理函数
alarm(5); // 每5秒触发信号

超时检测

  • 定时任务:服务端每秒检查时间差
  • 超时阈值:60秒无通信判定离线
  • 清理逻辑
    if(time(NULL) - tm > 4) {
    删除客户端记录
    }

关键函数

时间处理

  • time():获取1970年至今秒数
  • localtime():转换时间戳为tm结构体
  • strftime():格式化时间输出(如"%Y-%m-%d %H:%M:%S")

网络通信

  • recvfrom():接收UDP数据包
  • sendto():发送心跳包或业务数据

数据结构

消息类型

enum type_t { CHAR, HEART }; // CHAR=业务消息,HEART=心跳包

消息结构体

typedef struct msgbuf {
enum type_t type; // 消息类型
char text[128]; // 消息内容
} msgbuf_t;

客户端状态记录

typedef struct timebuf {
unsigned int ip; // 客户端IP
unsigned short port;// 端口号
time_t tm; // 最后通信时间
} timebuf_t;

代码结构

服务端逻辑

  1. 创建UDP套接字并绑定端口
  2. 启动独立线程检测超时客户端
  3. 接收消息后分类处理:
    • CHAR类型:更新通信时间并处理业务
    • HEART类型:仅更新时间戳

客户端逻辑

  1. 创建UDP套接字连接服务端
  2. 设置定时器发送心跳包:
    handler() {
    sendto(HEART包);
    alarm(5); // 重置5秒定时
    }

多线程处理

  • 超时检测线程
    pthread_create(&thread, NULL, cli_delete, NULL);
    pthread_detach(thread); // 分离线程
  • 清理逻辑
  • for循环遍历客户端列表,删除超时记录、

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

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

相关文章

文件相关操作

文本文件 程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放 通过文件可以将数据持久化 C的文件操作需要包含头文件 文件分类 文本文件:文件以文本的ASCII码形式存储在计算机中 二进制文件:文件以文本的二进制形式存储在计算…

[论文阅读]ControlNET: A Firewall for RAG-based LLM System

ControlNET: A Firewall for RAG-based LLM System [2504.09593] ControlNET: A Firewall for RAG-based LLM System RAG存在数据泄露风险和数据投毒风险。相关研究探索了提示注入和投毒攻击,但是在控制出入查询流以减轻威胁方面存在不足 文章提出一种ai防火墙CO…

C++中的各式类型转换

隐式转换&#xff1a; 基本类型的隐式转换&#xff1a; 当函数参数类型非精确匹配&#xff0c;但是可以转换的时候发生 如&#xff1a; void func1(double x){cout << x << endl; }void func2(char c){cout << c << endl; }int main(){func1(2);//…

2.重建大师输入输出数据格式介绍

摘要&#xff1a;本文主要介绍重建大师支持的输入数据格式及输出数据格式。 1.输入数据格式 1.1图像文件 重建大师支持JPG、JPEG和TIFF格式的照片。 不同架次照片放置于同级目录的不同文件夹&#xff0c;同一架次不同镜头拍摄得到的照片存放于不同的子文件夹&#xff0c;可使…

我们该如何使用DeepSeek帮我们减负?

在当今信息爆炸的时代&#xff0c;如何快速获取、筛选和分析信息已经成为各行各业的重要能力。而DeepSeek作为一种先进的智能搜索和信息挖掘工具&#xff0c;能够帮助用户快速找到所需的信息&#xff0c;并从海量数据中提取出有用的洞见。在这篇博文中&#xff0c;我们将深入探…

抗量子计算攻击的数据安全体系构建:从理论突破到工程实践

在“端 - 边 - 云”三级智能协同理论中&#xff0c;端 - 边、边 - 云之间要进行数据传输&#xff0c;网络的安全尤为重要&#xff0c;为了实现系统总体的安全可控&#xff0c;将构建安全网络。 可先了解我的前文&#xff1a;“端 - 边 - 云”三级智能协同平台的理论建构与技术实…

支付宝API-SKD-GO版

前言 支付宝api的sdk没有提供go版&#xff0c;这里自己封装了一个go版的sdk&#xff0c;有需要的朋友可以自取使用 支付宝 AliPay SDK for Go, 集成简单&#xff0c;功能完善&#xff0c;持续更新&#xff0c;支持公钥证书和普通公钥进行签名和验签。 Github地址 GitHub - …

JAVA研发+前后端分离,ZKmall开源商城B2C商城如何保障系统性能?

在电商行业竞争白热化的当下&#xff0c;B2C 商城系统的性能表现成为决定用户留存与商业成败的关键因素。ZKmall 开源商城凭借 Java 研发与前后端分离架构的深度融合&#xff0c;构建起一套高效、稳定且具备强大扩展性的系统架构&#xff0c;从底层技术到上层应用全方位保障性能…

volatile是什么

一、背景和问题描述 假设你写的这个多线程程序中&#xff0c;有两个线程&#xff1a; 子线程&#xff08;thr&#xff09;&#xff1a;把flag变量设为1&#xff0c;并输出“modify flag to 1”&#xff1b;主线程&#xff1a;一直在循环等待&#xff0c;直到flag变成1&#x…

MySQL的Docker版本,部署在ubantu系统

前言 MySQL的Docker版本&#xff0c;部署在ubantu系统&#xff0c;出现问题&#xff1a; 1.执行一个SQL&#xff0c;只有错误编码&#xff0c;没有错误提示信息&#xff0c;主要影响排查SQL运行问题&#xff1b; 2.这个问题&#xff0c;并不影响实际的MySQL运行&#xff0c;如…

专栏特辑丨悬镜浅谈开源风险治理之SBOM与SCA

随着容器、微服务等新技术日新月异&#xff0c;开源软件成为业界主流形态&#xff0c;软件行业快速发展。但同时&#xff0c;软件供应链也越来越趋于复杂化和多样化&#xff0c;软件供应链安全风险不断加剧。 软件供应链安全主要包括软件开发生命周期和软件生存运营周期&#x…

18.Excel数据透视表:第1部分创建数据透视表

一 什么是数据透视表 通过万花筒可以用不同的方式査看里面画面图像&#xff0c;在excel中可以将数据透视表看作是对准数据的万花筒&#xff0c;用不同角度去观察数据&#xff0c;也可以旋转数据&#xff0c;对数据进行重新排列&#xff0c;对大量的数据可以快速的汇总和建立交叉…

商业航天运动控制系统中的高可靠性芯片解决方案:挑战、策略与应用研究

摘要&#xff1a;随着商业航天领域的迅速发展&#xff0c;运动控制系统对芯片的可靠性提出了前所未有的挑战。本文深入探讨了商业航天运动控制系统中芯片可靠性面临的挑战&#xff0c;包括宇宙辐射效应、极端环境适应性及系统级可靠性保障等。同时&#xff0c;通过案例研究展示…

音视频学习:使用NDK编译FFmpeg动态库

1. 环境 1.1 基础配置 NDK 22b (r22b)FFmpeg 4.4Ubuntu 22.04 1.2 下载ffmpeg 官网提供了 .tar.xz 包&#xff0c;可以直接下载解压&#xff1a; wget https://ffmpeg.org/releases/ffmpeg-4.4.tar.xz tar -xvf ffmpeg-4.4.tar.xz cd ffmpeg-4.41.3 安装基础工具链 sudo …

前端开发避坑指南:React 代理配置常见问题与解决方案

前端开发避坑指南:React 代理配置常见问题与解决方案 一、为什么需要配置代理?二、使用 create-react-app 默认配置代理三、使用 http-proxy-middleware 配置复杂代理四、高级代理配置五、生产环境中的代理配置一、为什么需要配置代理? React 应用在开发过程中经常需要与后端…

用影刀RPA打通内容创作“最后一公里”:CSDN草稿一键同步多平台发布

文章目录 引言 一、需求场景&#xff1a;多平台分发的效率困境1. 痛点分析2. 影刀RPA的破局价值 二、影刀RPA是啥&#xff1f;打工人逆袭神器&#xff01;三、手把手教你造"搬运工"——技术宅的土味开发日记第一步&#xff1a;当个"偷窥狂"——观察手动操作…

进程与线程:09 进程同步与信号量

课程引入&#xff1a;进程同步与信号量 接下来这节课开始&#xff0c;我们再开始讲多进程图像。讲多进程图像的下一个点&#xff0c;前面我们讲清楚了多进程图像要想实现切换&#xff0c;调度是如何做的。同时&#xff0c;多个进程放在内存中&#xff0c;就会存在多进程合作的…

【愚公系列】《Manus极简入门》036-物联网系统架构师:“万物互联师”

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…

MySQL 8.0 OCP 英文题库解析(四)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题26~30 试题26:…

什么是原码和补码

补码的本质确实是模运算&#xff08;Modular Arithmetic&#xff09;&#xff0c;这是理解补码为何能统一加减法的核心数学原理。下面用最通俗的语言和例子解释清楚&#xff1a; —### 1. 先理解什么是“模运算”- 模运算就是“周期性计数”&#xff0c;比如钟表&#xff1a; -…