【C++】HP-Socket(三):UdpClient、UdpServer、UdpCast、UdpNode的区别

news/2024/10/19 5:28:31/

1、简述

UDP是无连接的,在UDP传输层中并没有客户端和服务端的概念。但是可以在应用层定义客户端和服务端,可以灵活的互换客户端和服务端,或者同时既是客户端也是服务端。

HP-Socket中在应用层定义了四种UDP组件:UdpClient、UdpServer、UdpCast、UdpNode

2、区别

1)UdpClient
UdpClient 是客户端的UDP,向服务器发送 UDP 数据包后等待接收响应。

2)UdpServer
UdpServer 是服务端的UDP,用于监听端口,接收来自多个客户端的 UDP 数据包,并可以向这些客户端发送响应。

3)UdpCast
UdpCast 是专用于 UDP 广播或组播的组件,和 UdpClient 类似继承自 IClient,本质也属于客户端。

4)UdpNode
UdpNode 是通用的 UDP 通信节点,没有客户端和服务端的概念,也可以认为既是客户端也是服务端
还可以实现广播和组播功能。

3、用法

3.1 UdpClient

基本用法

  • 创建 UdpClient 实例。
  • 调用 Start 方法启动客户端,并指定本地监听的 IP 和端口。
  • 使用 Send 方法向服务器发送数据。
  • 接收来自服务器的数据。
  • 调用 Stop 方法停止客户端。
#include "HPSocket.h"
#include "SocketInterface.h"int main() {IUdpClient* pClient = CreateUdpClient();if (pClient->Start("0.0.0.0", 0)) {const char* serverAddress = "127.0.0.1";USHORT serverPort = 5555;const char* message = "Hello, Server!";pClient->Send(serverAddress, serverPort, (const BYTE*)message, strlen(message));}pClient->Stop();DestroyUdpClient(pClient);return 0;
}

3.2 UdpServer

基本用法

  • 创建 UdpServer 实例。
  • 实现一个监听器类,继承自 IUdpServerListener,并实现其方法,如 OnPrepareListen、OnReceive 等。
  • 设置服务器的监听器。
  • 调用 Start 方法启动服务器,并指定监听的 IP 和端口。
  • 处理接收到的数据。
  • 调用 Stop 方法停止服务器
#include "HPSocket.h"
#include "SocketInterface.h"class CListener : public CUdpServerListener {
public:virtual EnHandleResult OnReceive(IUdpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {printf("Received: %s\n", pData);return HR_OK;}
};int main() {IUdpServer* pServer = CreateUdpServer();CListener listener;pServer->SetListener(&listener);if (pServer->Start("0.0.0.0", 5555)) {printf("Server started.\n");getchar();  // 等待输入,退出服务}pServer->Stop();DestroyUdpServer(pServer);return 0;
}

4、组播TTL和回环

1)TTL(Time To Live)即“生存时间”,用于指定数据包在网络中可以经过的最大路由器(跳数)数量。

  • TTL = 0:数据包只能在本地机器上循环,不会被发送到任何网络。
  • TTL = 1:数据包只能在同一子网内传输,不能跨越路由器。
  • 较高的TTL值:如果TTL值更高,数据包可以跨越多个路由器,从而到达更远的网络。

2)loop(环回)

  • 启用:发送的数据包可以被同一主机上的组播组成员接收。
  • 禁用:发送的数据包不会被发送者所在的主机接收。

http://www.ppmy.cn/news/1455308.html

相关文章

【高校科研前沿】中国科学院地理资源所钟帅副研究员研究组博士生朱屹东为一作在Top期刊发文:从潜力到利用:探索西藏风能资源开发的技术路径优化布局

01 文章简介 论文名称:From potential to utilization: Exploring the optimal layout with the technical path of wind resource development in Tibet(从潜力到利用:探索西藏风能资源开发的技术路径优化布局) 文章发表期刊:《…

VUE中定义通用函数export function

api/workAPI.js 定义一个dateTimeWeek function format2Digit(n) {//判断时间是否需要加0if (n < 10) {return "0" n;} else {return n;}}export function dateTimeWeek() {//设置返回显示的日期时间格式var date new Date();var year format2Digit(da…

ADS基础教程9-理想模型和厂商模型实现及对比

目录 一、概要二、厂商库使用1.新建cell2.调用厂商库中元器件3.元器件替换及参数选择4.完成参数选择5.导入子图 三、仿真实现注意事项 一、概要 本文将介绍在ADS中调用厂商提供的库&#xff0c;来进行原理图仿真&#xff0c;并实现与ADS系统提供的理想元器件之间的比较。 二、…

IDEA上文件换行符、分隔符(Line Separator)LF,CR,CRLF错乱影响Git上传Github或Gitee代码

IDEA上文件换行符、分隔符(Line Separator)LF&#xff0c;CR&#xff0c;CRLF错乱影响Git上传Github或Gitee代码 指定目录 然后就可以上传了 OK 一定注意更改Line Separator的文件目录 如果是target目录下的文件,是不能修改为LF的,把target文件删除,再重载一次main文件,就…

RabbitMQ是怎么做消息分发的?——Java全栈知识(14)

RabbitMQ是怎么做消息分发的&#xff1f; RabbitMQ 的消息分发分为五种模式&#xff1a;分别是简单模式、工作队列模式、发布订阅模式、路由模式、主题模式。 1、简单模式 publisher 直接发送消息到队列消费者监听并处理队列中的消息 简单模式是最基本的工作模式&#xff0c;…

【ARM 嵌入式 C 字符串系列 23.7 -- C 实现函数 isdigit 和 isxdigit】

请阅读【嵌入式开发学习必备专栏 】 文章目录 isdigit 和 isxdigit C代码实现实现 isdigit实现 isxdigit使用示例 isdigit 和 isxdigit C代码实现 在C语言中&#xff0c;isdigit和isxdigit函数用于检查一个字符是否分别为十进制数字或十六进制数字。以下是这两个函数的简单实现…

双色球案例【C#】

【实例类型】 1双色球类 方法的参数是对象。 public List<string> Numbers { get; set; } // 这个是对象的属性 /// <summary>/// 双色球类/// /// 作用&#xff1a;主要是用来封装数据/// </summary>public class DoubleChromosphere{//public str…

electron 通信总结

默认开启上下文隔离的情况下 渲染进程调用主进程方法&#xff1a; 主进程 在 main.js 中&#xff0c; 使用 ipcMain.handle&#xff0c;添加要处理的主进程方法 const { ipcMain } require("electron"); 在 electron 中创建 preload.ts 文件&#xff0c;从 ele…