当前位置: 首页 > news >正文

socket 收发TCP/UDP

一、c++

个人测试记录,有问题还请指出,谢谢

参考:C++开发基础之网络编程WinSock库使用详解TCP/UDP Socket开发_c++ udp使用什么库-CSDN博客

代码中Logger测试见文章: c++中spdlog的使用/python中logger的使用-CSDN博客

1、main.cpp

收发TCP信号:

#include <iostream>
#include <thread>
#include <vector>#include "Logger.h"
#include "SocketManager.h"#pragma warning(disable:4996)int main() {initLogger();SocketManager socket_manager;// 使用 std::thread 并传递成员函数的指针和对象实例的引用std::thread t1(&SocketManager::get_from_tcp, &socket_manager, 11100);// std::thread t2(&SocketManager::get_from_udp, &socket_manager, 11111);std::thread t3(&SocketManager::send_to_tcp, &socket_manager, "123456", "127.0.0.1", 11100);// std::thread t4(&SocketManager::send_to_udp, &socket_manager, "123456", "127.0.0.1", 11111);t1.detach();// t2.detach();t3.detach();// t4.detach();Sleep(6000000);return 0;
}

 运行结果如下:

 收发UDP信号:

#include <iostream>
#include <thread>
#include <vector>#include "Logger.h"
#include "SocketManager.h"#pragma warning(disable:4996)int main() {initLogger();SocketManager socket_manager;// 使用 std::thread 并传递成员函数的指针和对象实例的引用// std::thread t1(&SocketManager::get_from_tcp, &socket_manager, 11100);std::thread t2(&SocketManager::get_from_udp, &socket_manager, 11111);// std::thread t3(&SocketManager::send_to_tcp, &socket_manager, "123456", "127.0.0.1", 11100);std::thread t4(&SocketManager::send_to_udp, &socket_manager, "123456", "127.0.0.1", 11111);// t1.detach();t2.detach();// t3.detach();t4.detach();Sleep(6000000);return 0;
}

 运行结果如下:

2、SocketManager.h

// #pragma once  // 为确保在不同编译环境中使用,可以使用#define的方法
#ifndef	SOCKETMANAGER_H
#define SOCKETMANAGER_H#include <iostream>
#include <stdio.h>
#include <winsock2.h>
#include <string>
#include "Logger.h"#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996)std::string asciiToHex(const std::string& asciiStr); // 将ascii码转为十六进制class SocketManager {
public:SocketManager();~SocketManager();void initialization();  // 初始化套接字库void get_from_udp(int);   // 从客户端接收发来的udp信息void get_from_tcp(int); // 从客户端接收发来的tcp信息void send_to_tcp(std::string, std::string, int);  // 向服务端发送tcp信息void send_to_udp(std::string, std::string, int);  // 向服务端发送udp信息private://定义服务端套接字,接受请求套接字SOCKET ListenSocket_UDP_get;SOCKET ListenSocket_TCP_get;SOCKET SendSocket_UDP_to;SOCKET SendSocket_TCP_to;//服务端/客户端地址SOCKADDR_IN service_UDP_get;SOCKADDR_IN service_TCP_get;SOCKADDR_IN service_UDP_to;SOCKADDR_IN service_TCP_to;
};#endif  // SOCKETMANAGER_H

3、SocketManager.cpp

#include "SocketManager.h"SocketManager::SocketManager() {ListenSocket_UDP_get = INVALID_SOCKET;ListenSocket_TCP_get = INVALID_SOCKET;SendSocket_UDP_to = INVALID_SOCKET;SendSocket_TCP_to = INVALID_SOCKET;
}SocketManager::~SocketManager() {if (ListenSocket_UDP_get != INVALID_SOCKET) {closesocket(ListenSocket_UDP_get);WSACleanup();}if (ListenSocket_TCP_get != INVALID_SOCKET) {closesocket(ListenSocket_TCP_get);WSACleanup();}if (SendSocket_UDP_to != INVALID_SOCKET) {closesocket(SendSocket_UDP_to);WSACleanup();}if (SendSocket_TCP_to != INVALID_SOCKET) {closesocket(SendSocket_TCP_to);WSACleanup();}
}void SocketManager::get_from_udp(int port) {// 初始化套接字库initialization();// 创建套接字ListenSocket_UDP_get = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (ListenSocket_UDP_get == INVALID_SOCKET) {logger->error("创建套接字失败:" + WSAGetLastError());std::cout << "创建套接字失败:"<< WSAGetLastError() << std::endl;WSACleanup();exit(0);}//填充服务端信息service_UDP_get.sin_family = AF_INET;  // 设置地址族为 IPv4service_UDP_get.sin_addr.s_addr = INADDR_ANY;  // 将 IP 地址设置为 0.0.0.0,表示绑定到所有本地 IP 地址service_UDP_get.sin_port = htons(port);   // 将端口号转换为网络字节序,并设置为指定的端口号// 绑定套接字if (bind(ListenSocket_UDP_get, (SOCKADDR*)&service_UDP_get, sizeof(service_UDP_get)) == SOCKET_ERROR){logger->error("绑定套接字失败: " + WSAGetLastError());std::cout << "绑定套接字失败: " + WSAGetLastError() << std::endl;closesocket(ListenSocket_UDP_get);WSACleanup();exit(0);}char recvbuf[512];  // 定义接收信息的缓冲区,大小为512字节int iRecvResult;  // 存储接收操作的返回结果sockaddr_in clientAddr;   // 用于存储客户端的地址信息int iAddrLen = sizeof(clientAddr);  // 存储地址结构体的大小do{	std::cout << "服务端正在等待数据发送,请稍候...." << std::endl;// 接收来自客户端的数据iRecvResult = recvfrom(ListenSocket_UDP_get, recvbuf, sizeof(recvbuf), 0, (SOCKADDR*)&clientAddr, &iAddrLen);// std::cout << iRecvResult << std::endl;// 检查接收操作是否成功if (iRecvResult > 0){std::string result(recvbuf, iRecvResult);std::cout << "收到信息:" + result << std::endl;logger->info("收到信息:" + result);// 将接收到的数据发送回客户端// sendto(ListenSocket_UDP, recvbuf, iRecvResult, 0, (SOCKADDR*)&clientAddr, sizeof(clientAddr));}else if (iRecvResult == 0){std::cout << "连接关闭" << std::endl;logger->info("连接关闭");}else{std::cout << "接受信息失败:" << WSAGetLastError() << std::endl;logger->error("接受信息失败:" + WSAGetLastError());closesocket(ListenSocket_UDP_get);WSACleanup();}} while (iRecvResult > 0);closesocket(ListenSocket_UDP_get);WSACleanup();
}void SocketManager::initialization() {//初始化套接字库WORD w_req = MAKEWORD(2, 2);//版本号WSADATA wsadata;int err;err = WSAStartup(w_req, &wsadata);if (err != 0) {std::cout << "初始化套接字库失败!" << std::endl;}//检测版本号if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {std::cout << "套接字库版本号不符!" << std::endl;WSACleanup();}//填充服务端地址信息
}void SocketManager::send_to_tcp(std::string str, std::string ip, int port) {int send_len = 0;// 初始化套接字库initialization();//填充服务端信息service_TCP_to.sin_family = AF_INET;service_TCP_to.sin_addr.S_un.S_addr = inet_addr(ip.c_str());service_TCP_to.sin_port = htons(port);//创建套接字SendSocket_TCP_to = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (SendSocket_TCP_to == INVALID_SOCKET) {logger->error("创建套接字失败:" + WSAGetLastError());std::cout << "创建套接字失败:" << WSAGetLastError() << std::endl;WSACleanup();exit(1);}if (connect(SendSocket_TCP_to, (SOCKADDR*)&service_TCP_to, sizeof(SOCKADDR)) == SOCKET_ERROR) {std::cout << "服务器连接失败:" << WSAGetLastError() << std::endl;logger->error("服务器连接失败:" + WSAGetLastError());WSACleanup();exit(1);}// 发送信息send_len = send(SendSocket_TCP_to, str.c_str(), str.size(), 0);if (send_len < 0) {std::cout << "发送失败:" << WSAGetLastError() << std::endl;logger->error("发送失败:" + WSAGetLastError());}std::cout << send_len << "发送成功" << std::endl;//关闭套接字//closesocket(SendSocket_TCP_to);//释放DLL资源//WSACleanup();
}void SocketManager::get_from_tcp(int port) {// 初始化套接字库initialization();// 创建套接字ListenSocket_TCP_get = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   // tcp与udp之间有所不同if (ListenSocket_TCP_get == INVALID_SOCKET) {logger->error("创建套接字失败:" + WSAGetLastError());std::cout << "创建套接字失败:" << WSAGetLastError() << std::endl;WSACleanup();exit(1);}//填充服务端信息service_TCP_get.sin_family = AF_INET;  // 设置地址族为 IPv4service_TCP_get.sin_addr.s_addr = INADDR_ANY;  // 将 IP 地址设置为 0.0.0.0,表示绑定到所有本地 IP 地址service_TCP_get.sin_port = htons(port);   // 将端口号转换为网络字节序,并设置为指定的端口号// 绑定套接字if (bind(ListenSocket_TCP_get, (SOCKADDR*)&service_TCP_get, sizeof(service_TCP_get)) == SOCKET_ERROR){logger->error("绑定套接字失败: " + WSAGetLastError());std::cout << "绑定套接字失败: " + WSAGetLastError() << std::endl;closesocket(ListenSocket_TCP_get);WSACleanup();exit(1);}char recvbuf[512];  // 定义接收信息的缓冲区,大小为512字节int iRecvResult;  // 存储接收操作的返回结果int len = 0;//设置套接字为监听状态if (listen(ListenSocket_TCP_get, SOMAXCONN) < 0) {std::cout << "设置监听状态失败:" << WSAGetLastError() << std::endl;logger->error("设置监听状态失败:" + WSAGetLastError());WSACleanup();}std::cout << "服务端正在监听连接,请稍候...." << std::endl;len = sizeof(service_TCP_get);SOCKET ClientSocket = INVALID_SOCKET;  // 初始化 ClientSocket 变量并将其设置为无效的套接字do{std::cout << "服务端正在等待数据发送,请稍候...." << std::endl;ClientSocket = accept(ListenSocket_TCP_get, (SOCKADDR*)&service_TCP_get, &len); // 等待客户端连接请求并接受连接/*accept 函数会阻塞,直到有客户端连接请求到达,然后返回一个新的套接字ListenSocket_TCP_get 是服务器监听的套接字service_TCP_get 是用于存储客户端地址信息的结构体len 是地址结构体的大小,accept 函数调用时会被更新为实际的地址大小*/// std::cout << ClientSocket << std::endl;if (ClientSocket == SOCKET_ERROR) {std::cout << "算法端连接失败:" + WSAGetLastError() << std::endl;logger->error("算法端连接失败:" + WSAGetLastError());WSACleanup();exit(2);}// 接收来自客户端的数据iRecvResult = recv(ClientSocket, recvbuf, sizeof(recvbuf), 0);// 检查接收操作是否成功if (iRecvResult > 0){// std::cout << iRecvResult << std::endl;std::string result(recvbuf, iRecvResult);std::cout << "收到信息:" + result << std::endl;logger->info("收到信息:" + result);// 将接收到的数据发送回客户端// sendto(ListenSocket_UDP, recvbuf, iRecvResult, 0, (SOCKADDR*)&clientAddr, sizeof(clientAddr));}else if (iRecvResult == 0){std::cout << "连接关闭" << std::endl;logger->info("连接关闭");}else{std::cout << "接受信息失败:" << WSAGetLastError() << std::endl;logger->error("接受信息失败:" + WSAGetLastError());closesocket(ListenSocket_UDP_get);WSACleanup();}} while (iRecvResult > 0);closesocket(ListenSocket_TCP_get);WSACleanup();
}void SocketManager::send_to_udp(std::string str, std::string ip, int port) {int send_len = 0;// 初始化套接字库initialization();//填充服务端信息service_UDP_to.sin_family = AF_INET;service_UDP_to.sin_addr.S_un.S_addr = inet_addr(ip.c_str());service_UDP_to.sin_port = htons(port);//创建套接字SendSocket_UDP_to = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (SendSocket_UDP_to == INVALID_SOCKET) {logger->error("创建套接字失败:" + WSAGetLastError());std::cout << "创建套接字失败:" << WSAGetLastError() << std::endl;WSACleanup();exit(0);}int iSendResult = sendto(SendSocket_UDP_to, str.c_str(), str.size(), 0, (SOCKADDR*)&service_UDP_to, sizeof(service_UDP_to));if (iSendResult == SOCKET_ERROR) {std::cout << "发送失败:" << WSAGetLastError() << std::endl;logger->error("发送失败:" + WSAGetLastError());}//关闭套接字closesocket(SendSocket_UDP_to);//释放DLL资源WSACleanup();
}std::string asciiToHex(const std::string& asciiStr) {std::string hexStr;for (char c : asciiStr) {unsigned char value = static_cast<unsigned char>(c);hexStr += std::to_string(static_cast<int>(value >> 4)) + std::to_string(static_cast<int>(value & 0x0F));}return hexStr;
}

相关文章:

socket 收发TCP/UDP

一、c 个人测试记录&#xff0c;有问题还请指出&#xff0c;谢谢 参考&#xff1a;C开发基础之网络编程WinSock库使用详解TCP/UDP Socket开发_c udp使用什么库-CSDN博客 代码中Logger测试见文章&#xff1a; c中spdlog的使用/python中logger的使用-CSDN博客 1、main.cpp 收…...

Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档

什么是 Swagger ? Swagger 是一组围绕 OpenAPI 规范构建的开源工具&#xff0c;可以帮助您设计、构建、记录和使用 REST API。主要的 Swagger 工具 包括&#xff1a; Swagger Editor&#xff1a;基于浏览器的编辑器&#xff0c;您可以在其中编写 OpenAPI 定义Swagger UI&…...

spark shell

1.进行shell命令行 spark-shell 2.创建RDD 2.1 读取文件创建RDD 2.1.1读取linux文件系统的文件创建RDD --需要保证每一个worker中都有该文件 val data1 sc.textFile("file:/opt/file/word.txt") 2.1.2读取hdfs文件系统上的文件创建RDD val data2sc.textFile("…...

集群架构-web服务器(接入负载均衡+数据库+会话保持redis)--15454核心配置详解

紧接着前面的集群架构深化—中小型公司&#xff08;拓展到大型公司业务&#xff09;–下面图简单回顾一下之前做的及故障核心知识总结&#xff08;等后期完全整理后&#xff0c;上传资源希望能帮大家&#xff09; web集群架构-接入负载均衡部署web02服务器等 web集群-搭建web0…...

# Redis 入门到精通(七)-- redis 删除策略

Redis 入门到精通&#xff08;七&#xff09;-- redis 删除策略 一、redis 删除策略–过期数据的概念 1、Redis 中的数据特征 Redis 是一种内存级数据库&#xff0c;所有数据均存放在内存中&#xff0c;内存中的数据可以通过TTL指令获取其状态。 XX &#xff1a;具有时效性…...

10:00面试,10:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到6月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

html+canvas 实现签名功能-手机触摸

手机上的效果图 需要注意&#xff0c;手机触摸和鼠标不是一个事件&#xff0c;不能通用&#xff0c;上一篇是关于使用鼠标的样例 相关代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewpo…...

前端组件化探索与实践:Vue自定义暂无数据组件的开发与应用

摘要 随着前端开发技术的不断进步&#xff0c;组件化开发已成为提升开发效率、降低维护成本的关键手段。本文旨在通过介绍一款Vue自定义暂无数据组件的开发与实践&#xff0c;深入探讨前端组件化开发的重要性、优势及其在实际项目中的应用。 一、引言 在前端开发中&#xff0…...

《汇编语言 基于x86处理器》- 读书笔记 - Visual Studio 2019 配置 MASM环境

安装 Visual Studio 2019 配置 MASM环境 下载 Visual Studio Installer安装 Visual Studio 20191. 双击运行2. 自定义安装内容3. 修改 MSVC 工具集版本4. 设置主题&#xff08;可选&#xff09;5. 安装代码高亮插件 AsmDude&#xff08;可选&#xff09;6. 通义灵码&#xff08…...

Air780E/Air780EP/Air780EQ/Air201模块遇到死机问题如何分析

Air780E/Air780EP/Air780EQ/Air201模块遇到死机问题如何分析 简介 本文档适用于合宙Air780E、Air780EP、Air780EQ、Air201 关联文档和使用工具&#xff1a; 从Ramdump里分析内存泄漏问题 无法抓底层log的情况下如何导出死机dump Luatools下载调试工具 EPAT抓取底层日志 F…...

吴松洋院长 艺后整形集团专家组特约成员 全方位责任塑美

...

前端经验:使用sheetjs导出CSV文本为excel

应用场景 很多web表格组件没有提供直接的导出excel功能&#xff0c;但提供了导出CSV的功能。 如果能想办法拿到CSV的内容&#xff0c;就可以利用sheetjs生成excel并导出。 实施步骤 1.拿到CSV的内容字符 每种表格组件都有各自的CSV生成方法&#xff0c;不管用什么方法&…...

【nnUNetv2进阶】十五、nnUNetv2 魔改网络-小试牛刀-引入ECA

nnunet使用及改进教程。 【nnUNetv2实践】一、nnUNetv2安装 【nnUNetv2实践】二、nnUNetv2快速入门-训练验证推理集成一条龙教程 【nnUNetv2进阶】三、nnUNetv2 自定义网络-发paper必会-CSDN博客 其他网络改进参考: 【nnUNetv2进阶】四、nnUNetv2 魔改网络-小试牛刀-加入…...

centos(或openEuler系统)安装kafka集群

安装192.168.9.60、192.168.9.61、192.168.9.62这3台kafka集群&#xff08;kraft模式&#xff0c;不用zookeeper&#xff09; 不带密码的 1.每台机器安装kafka&#xff1a; cd /home/kafka wget https://downloads.apache.org/kafka/3.3.1/kafka_2.13-3.3.1.tgz 不通就换这…...

HarmonyOS根据官网写案列~ArkTs从简单地页面开始

Entry Component struct Index {State message: string 快速入门;build() {Column() {Text(this.message).fontSize(24).fontWeight(700).width(100%).textAlign(TextAlign.Start).padding({ left: 16 }).fontFamily(HarmonyHeiTi-Bold).lineHeight(33)Scroll() {Column() {Ba…...

GraphRAG+ollama+LM Studio+chainlit

这里我们进一步尝试将embedding模型也换为本地的&#xff0c;同时熟悉一下流程和学一些新的东西 1.环境还是用之前的&#xff0c;这里我们先下载LLM 然后你会在下载nomic模型的时候崩溃&#xff0c;因为无法搜索&#xff0c;无法下载 解决办法如下lm studio 0.2.24国内下载…...

【中项第三版】系统集成项目管理工程师 | 第 5 章 软件工程② | 5.4 - 5.8

前言 第 5 章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术的内容&#xff0c;学习要以教材为准。 目录 5.4 软件实现 5.4.1 软件配置管理 5.4.2 软件编码 5.4.3 软件测试 5.5 部署交付 5.5.1 软件部署 5.5.2 软件交付 5.5.3 持续交付 5.5.4…...

6. dolphinscheduler-3.0.0伪集群部署

环境说明&#xff1a; 主机名&#xff1a;cmc01为例 操作系统&#xff1a;centos7 安装部署软件版本部署方式centos7zookeeperzookeeper-3.4.10伪分布式hadoophadoop-3.1.3伪分布式hivehive-3.1.3-bin伪分布式clickhouse21.11.10.1-2单节点多实例dolphinscheduler3.0.0单节…...

防火墙内容安全综合实验

一、实验拓扑 二、实验要求 1&#xff0c;假设内网用户需要通过外网的web服务器和pop3邮件服务器下载文件和邮件&#xff0c;内网的FTP服务器也需要接受外网用户上传的文件。针对该场景进行防病毒的防护。 2&#xff0c;我们需要针对办公区用户进行上网行为管理&#xff0c;要…...

常见的数据分析用例 —— 信用卡交易欺诈检测

文章目录 引言数据集分析1. 读入数据并快速浏览2.计算欺诈交易占数据集中交易总数的百分比3. 类别不平衡对模型的影响3.1 总体思路&#xff08;1&#xff09;数据的划分&#xff08;2&#xff09;训练模型&#xff08;3&#xff09;测试模型&#xff08;4&#xff09;解决不平衡…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...