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

【sylar-webserver】9 网络模块

目录

Address

类图

知识点

常用结构体

常用函数

Socket

类图

主要功能

初始化 socket 流程:

ByteArray

知识点

zigzag 算法

TLV 编码结构

Stream

类图

Stream 流结构,提供字节流读写接口

SocketStream

TcpServer

类图

主要功能


Address

类图

功能:

  1. sylar::Address::GetInterfaceAddresses 查询所有的网卡 / 指定网卡。通过 getifaddrs
  2. sylar::Address::Lookup 进行网络地址解析(包括字符串形式的域名/主机名或是数字格式的IP地址,支持端口和服务名解析)。
  3. sylar::Address::LookupAny 通过host地址返回对应条件的任意Address
  4. sylar::Address::LookupAnyIPAddress,通过host地址返回对应条件的任意IPAddress
  5. sylar::IPAddress::Create 通过域名,IP,服务器名创建IPAddress。通过 getaddrinfo 解析地址是否是 IPv4 / IPv6
  6. sylar::UnixAddress 创建 UnixAddress

知识点

常用结构体

  • ifaddrs
struct ifaddrs {struct ifaddrs  *ifa_next;    // 指向列表中下一个结构的指针。该字段在列表的最后一个结构中为 NULLchar            *ifa_name;   // 接口名称unsigned int     ifa_flags;   // 提供有关接口的一些信息的标志struct sockaddr *ifa_addr;   // 接口地址struct sockaddr *ifa_netmask; // 接口的网络掩码union {struct sockaddr *ifu_broadaddr;		// 接口广播地址struct sockaddr *ifu_dstaddr;	    // 点对点目的地址                 } ifa_ifu;#define              ifa_broadaddr ifa_ifu.ifu_broadaddr#define              ifa_dstaddr   ifa_ifu.ifu_dstaddrvoid            *ifa_data;    	// 特定地址族数据的缓冲区
};
  • sockaddr
struct sockaddr {ushort  sa_family;	 // 网络协议char    sa_data[14];
};
  • sockaddr_in
struct sockaddr_in {short            sin_family;   // 网络协议unsigned short   sin_port;     // 端口struct in_addr   sin_addr;     // ipchar             sin_zero[8];  
};struct in_addr {unsigned long s_addr;  // 使用 inet_aton() 加载
};
  • sockaddr_in6
struct sockaddr_in6 {sa_family_t     sin6_family;   /* 网络协议 */in_port_t       sin6_port;     /* 端口 */uint32_t        sin6_flowinfo; /* IPv6 流信息 */struct in6_addr sin6_addr;     /* ip */uint32_t        sin6_scope_id; 
};struct in6_addr {unsigned char   s6_addr[16];   /* IPv6 address */
};     

我们发现结构 sockaddr 和 sockaddr_in 字节数完全相同,都是16个字节,所以可以直接强转。
但是结构 sockaddr_in6 有28个字节,为什么在使用的时候也是直接将地址强制转化成(sockaddr*)类型呢?

这几个结构在作为参数时基本上都是以指针的形式传入的

我们拿函数bind()为例,这个函数一共接收三个参数:

第一个为监听的文件描述符。

第二个参数是sockaddr*类型。

第三个参数是传入指针原结的内存大小。

所以有了后两个信息,无所谓原结构怎么变化,因为他们的头都是一样的,也就是uint16 sa_family,那么我们也能根据这个头做处理。

  • addrinfo
struct addrinfo {int              ai_flags;     // 地址信息标志int              ai_family;    // 地址族(AF_INET, AF_INET6, AF_UNSPEC)int              ai_socktype;  // 套接字类型(SOCK_STREAM, SOCK_DGRAM)int              ai_protocol;  // 协议号(IPPROTO_TCP, IPPROTO_UDP),或0表示任意协议socklen_t        ai_addrlen;   // 地址长度struct sockaddr *ai_addr;      // 网络地址结构指针char            *ai_canonname; // 规范名字(主机名或服务名)struct addrinfo *ai_next;      // 指向下一个addrinfo结构的指针
};

通过调用getaddrinfo()函数可以填充并返回一个或多个addrinfo结构,其中包含了特定主机名和服务名对应的可用地址信息。

常用函数

  • getifaddrs / freeifaddrs

getifaddrs 是 C 语言中用于获取本地网络接口(如网卡、虚拟接口)信息的函数。它返回一个链表,其中每个节点包含接口的名称、IP 地址、子网掩码、广播地址等信息。与 getaddrinfo(用于解析远程主机地址)不同,getifaddrs 专注于 本地网络接口的配置。⭐

#include <sys/types.h>
#include <ifaddrs.h>int getifaddrs(struct ifaddrs **ifap);
/**
* func:函数存储对ifaddrs结构的链表的引用;
* return:成功返回0,失败返回-1;
*/void freeifaddrs(struct ifaddrs *ifa);
/**
* func:释放对ifaddrs结构的链表的引用;
*/

【注意】: 返回的数据是动态分配的,需要释放;

  • getaddrinfo / freeaddrinfo

getaddrinfo 是 C 语言中用于处理网络地址和服务的函数,能够将 主机名(如 example.com)和 服务名(如 http 或端口号 80)转换为套接字地址结构(如 struct sockaddr_insockaddr_in6)。它是网络编程中替代旧函数 gethostbynamegetservbyname 的现代方法,支持 IPv4/IPv6 和协议无关性。⭐

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>int getaddrinfo(const char *node,         // 主机名或IP地址字符串(如 "example.com")const char *service,      // 服务名或端口号字符串(如 "80" 或 "http")const struct addrinfo *hints, // 输入提示(期望的地址类型)struct addrinfo **res     // 返回结果的链表
);void freeaddrinfo(struct addrinfo *res); // 释放内存
  • getnameinfo

getnameinfo 是 C 语言中用于将 套接字地址结构(如 struct sockaddr_insockaddr_in6)转换为 可读的主机名服务名 的函数。它是 getaddrinfo 的逆操作,通常用于将二进制网络地址(如 0x7F000001)转换为人类可读的字符串(如 "127.0.0.1""http")。支持 IPv4/IPv6 和协议无关性。

#include <sys/socket.h>
#include <netdb.h>int getnameinfo(const struct sockaddr *sa, socklen_t salen,char *host, size_t hostlen,char *serv, size_t servlen, int flags);
/**
* func:将套接字地址转换为相应的主机和服务并返回;
* @param sa:套接字地址结构,保存输入的IP地址和端口号;
* @param salen:sa的长度;
* @param host:调用者分配缓冲区;
* @param hostlen:host长度;
* @param serv:调用者分配缓冲区;
* @param servlen:serv长度
* @param flags:NI_NAMEREQD:若无法确定主机名,则返回一个错误;NI_DGRAM:基于数据报(UDP)而不是基于流(TCP)的;NI_NOFQDN:只返回本地主机的完全限定域名的主机名部分;NI_NUMERICHOST:返回主机名的数字形式;NI_NUMERICSERV:返回服务地址的数字形式;* return:成功返回0,【节点和服务名称将使用以空字符结尾的字符串填充】;失败设置errno:EAI_AGAIN:			无法解析该名称, 稍后再试;EAI_BADFLAGS:		flags参数的值无效;EAI_FAIL:			不可恢复的错误;EAI_FAMILY:		无法识别地址族,或指定地址族的地址长度无效EAI_MEMORY:		溢出;EAI_NONAME:		名称不能解析所提供的参数EAI_OVERFLOW:		溢出;EAI_SYSTEM:		系统错误;
*/

【注意】:调用者可以通过提供一个NULL host(或serv)参数或一个零hostlen(或servlen)参数来指定不需要主机名(或不需要服务名)。 但是,必须请求至少一个主机名或服务名。

Socket

类图

主要功能

  • 封装 socketfd,以及绑定的的本地地址和远端地址
  • 设置 SendTimeout,RecvTimeout
  • accept,bind,connect,reconnect,listen,close,send,sendTo,recv,recvFrom
  • getRemoteAddress,getLocalAddress
  • 取消 socketfd 绑定的 读事件 / 写事件 / accept(读事件)/ 全部事件。直接触发
  • Socket 延迟初始化,Socket()默认构造 m_sock = -1
    • accept,new Socket() --> ::accept(得到 socketfd) --> init --> initSock / getLocalAddress / getRemoteAddress
    • 初次 bind, newSock() ---> socket(得到 socketfd) ---> initSock / getLocalAddress / getRemoteAddress
    • 初次 connect,同 bind 相同操作

初始化 socket 流程:

sylar::Socket::CreateTCPSocket();  -->   Socket::ptr sock(new Socket(IPv4, TCP, 0));  --->  空的socket,m_sock = -1sylar::Address::LookupAnyIPAddress("www.baidu.com") ---> Address::Lookup  ---> getaddrinfosocket->connect(addr);	--->   延迟初始化 newSock()	---> 	m_sock = socket(m_family, m_type, m_protocol);|                	initSock();		---> 	setOption(SOL_SOCKET, SO_REUSEADDR, val);|                                            // 避免 TCP 粘包|                                            // 如果套接字类型为流式套接字(SOCK_STREAM),则禁用Nagle算法(TCP_NODELAY)v                                            if(m_type == SOCK_STREAM){ setOption(SOL_SOCKET, TCP_NODELAY, val); }( 两种 connect )::connect(m_sock, addr->getAddr(), addr->getAddrLen()                                                                          ::connect_with_timeout(m_sock, addr->getAddr(), addr->getAddrLen(), timeout_ms)     |         v// 客户端 connect 连接成功后,m_sock绑定了本地地址和远端地址getRemoteAddress();				---> 			getpeernamegetLocalAddress();				---> 			getsocknamesocket->send(buff, sizeof(buff));		---> 		::send(m_sock, buffer, length, flags);
socket->recv(&buf[0], buf.size());		---> 		::recv(m_sock, buffer, length, flags);

ByteArray

序列化 / 反序列化 操作

字节数组容器,提供基础类型的序列化与反序列化功能。

ByteArray的底层存储是固定大小的块,以链表形式组织。每次写入数据时,将数据写入到链表最后一个块中,如果最后一个块不足以容纳数据,则分配一个新的块并添加到链表结尾,再写入数据。ByteArray会记录当前的操作位置,每次写入数据时,该操作位置按写入大小往后偏移,如果要读取数据,则必须调用setPosition重新设置当前的操作位置。

ByteArray支持基础类型的序列化与反序列化功能,并且支持将序列化的结果写入文件,以及从文件中读取内容进行反序列化。ByteArray支持以下类型的序列化与反序列化:

  • 固定长度的有符号/无符号8位、16位、32位、64位整数
  • 不固定长度的有符号/无符号32位、64位整数
  • float、double类型
  • 字符串,包含字符串长度,长度范围支持16位、32位、64位。
  • 字符串,不包含长度。

以上所有的类型都支持读写。

ByteArray还支持设置序列化时的大小端顺序。

实际使用时,通常先通过 getWriteBuffers 获取到一段可写缓存,然后写入数据,手动 setPosition 设置实际的缓存偏移。

知识点

zigzag 算法

用于压缩较小的整数,参考:小而巧的数字压缩算法:zigzag_简单的老王-CSDN博客_zigzag编码

ByteArray在序列化不固定长度的有符号/无符号32位、64位整数时使用了zigzag算法。

简单来说,编码过程:负数变成 2 *(-a) - 1 ,转换为正奇数;正数变成 2 * a,转换为正偶数;解码过程,反操作即可。

TLV 编码结构

用于序列化和消息传递,指Tag(类型),Length(长度),Value(值),参考:TLV编码通信协议设计 - Tango 博客 | Tango Blog。

ByteArray在序列化字符串时使用TLV中的Length和Value。

Stream

类图

  • Stream 流结构,提供字节流读写接口

所有的流结构都继承自抽象类Stream,Stream类规定了一个流必须具备read/write接口和readFixSize/writeFixSize接口,继承自Stream的类必须实现read/write接口。Stream 里的 readFixSize/writeFixSize 通过调用重写的 read/write 实现。

SocketStream

对 Socket 进一步管理,使用通用接口 read / write 对 Socket 进行操作

HttpSession 见 HTTP 模块。HttpSession 代表 服务器 accept 的部分,HttpConnection 代表客户端 connect 的部分。

TcpServer

类图

主要功能

TcpServer 对 Socket,IOManager,进行了管理

支持对多个 Address 进行监听:

TcpServer::bind(addrs, fails)	--->	遍历addrs,根据addr的Family创建一个相同Family的TCP Socket |          vsock->bind(addr)		--->	Socket::newSock()初始化socket| vsock->listen()

m_acceptWorker,m_ioWorker 两个 iom,分别管理 accept 事件,accpet 后 client 的处理。

TcpServer::start()  --->   m_acceptWorker->schedule(std::bind(&TcpServer::startAccept, shared_from_this() , i));// m_acceptWorker 处理 所有 Socket 的 Accpet 操作,(读操作)
TcpServer::startAccept(Socket::ptr sock) ---> Socket::ptr client = sock->accept();	--->  m_ioWorker->schedule(std::bind(&TcpServer::handleClient, shared_from_this(), client));// m_ioWorker 处理 所有 accpet 后对 client 的操作,子类负责重写handleClient方法,实现不同操作。

这里的网络模块,比较简单,后续待优化⭐

相关文章:

【sylar-webserver】9 网络模块

目录 Address 类图 知识点 常用结构体 常用函数 Socket 类图 主要功能 初始化 socket 流程&#xff1a; ByteArray 知识点 zigzag 算法 TLV 编码结构 Stream 类图 Stream 流结构&#xff0c;提供字节流读写接口 SocketStream TcpServer 类图 主要功能 Address…...

野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(四)安装RKNN Toolkit2

RKNN Toolkit2是用来将onnx模型转成rknn专用模型&#xff0c;并可通过RKNN Toolkit Lite2或者RKNPU调用NPU进行加速计算的工具。 一开始我安装很多次都无法成功安装。后来跟售后技术对接&#xff0c;必须是PC平台的Linux环境才可以。我的电脑是windows&#xff0c;所以我需要用…...

第六部分:阶段项目 5:构建 NestJS RESTful API 服务器

现在&#xff0c;是时候将你学到的 NestJS 知识付诸实践&#xff0c;构建一个简单的 RESTful API 服务器了。我们将基于第四阶段的项目&#xff08;博客文章 API 或任务管理 API&#xff09;&#xff0c;使用 NestJS 的方式重新实现它。 选择以下一个项目&#xff1a; 项目选…...

【工作流】Fastgpt配置豆包模型-火山引擎

V4.9.7 Fastgpt现在不通过oneapi 来配置模型和渠道了&#xff0c; 可以直接在页面进行设置 首先在账号- 模型提供商里面 填入豆包的信息&#xff1a; 渠道名随便填&#xff0c;厂商选豆包&#xff0c; 然后选3个模型&#xff0c;如图所示 如果没有填入模型映射的话是没办法 …...

vite搭建vue3项目及相关配置

1.npm create vite 设置你的项目名&#xff0c;选择框架&#xff0c;选择语言 我此处选的为Vue typescripe 2.按照命令去执行 cd vite-vue3-app 进入项目文件&#xff0c;npm install 安装依赖&#xff0c;npm run dev 运行项目 此处由于node、npm版本导致报错问题如图 在…...

web实验(2)

实验1 搭建nginxssl的加密认证web服务器 第一步&#xff1a;准备工作 # 恢复快照 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld [rootserver ~]# systemctl disable firewalld [rootserver ~]# yum install nginx mod_ssl -y [r…...

数字孪生技术如何重塑能源产业?

近年来&#xff0c;全球能源行业正步入一个前所未有的转型期。一方面&#xff0c;“双碳”目标驱动能源结构向低碳化、清洁化发展&#xff1b;另一方面&#xff0c;新能源比例快速上升&#xff0c;给传统电力系统带来巨大的不确定性。与此同时&#xff0c;数字化浪潮也席卷能源…...

你通俗易懂的理解——线程、多线程与线程池

一&#xff1a;异常处理 1.1 异常概述 &#xff08;1&#xff09;场景 &#xff08;2&#xff09;定义 &#xff08;3&#xff09;异常抛出机制 Java把不同的异常用不同的类表示 &#xff08;4&#xff09;如何对待异常 1.2 常见异常类 &#xff08;1&#xff09;Throwable &am…...

spring+tomcat 用户每次发请求,tomcat 站在线程的角度是如何处理用户请求的,spinrg的bean 是共享的吗

对于 springtomcat 用户每次发请求&#xff0c;tomcat 站在线程的角度是如何处理的 比如 bio nio apr 等情况 tomcat 配置文件中 maxThreads 的数量是相对于谁来说的&#xff1f; 以及 spring Controller 中的全局变量:各种bean 对于线程来说是共享的吗&#xff1f; 一、Tomca…...

机器人坐标系标定

机器人坐标系标定 机器人坐标系标定 1. 知识目标 理解机器人坐标系的定义掌握机器人坐标系的分类 2. 技能目标 能够正确标定机器人坐标系 3. 机器人坐标系的作用 代表不同的物体或边界示例&#xff1a; 相对于桌子、弓箭、坯料、其他机器或边界移动 用途&#xff1a; 使用…...

VR光伏车棚虚拟仿真系统:开启绿色能源新视界​

VR 光伏车棚虚拟仿真系统&#xff0c;是一种集成了先进计算机技术与前沿虚拟现实技术的创新工具。它的核心在于&#xff0c;通过数字化手段高度逼真地模拟光伏车棚电站从规划建设到实际运行的全流程情境 &#xff0c;为相关人员提供一个沉浸式、交互式的虚拟操作空间。​ 借助 …...

阿里云服务器 篇十三(加更):Web书签(链接共享和迷你导航):改为使用宿主机DB等优化

文章目录 系列文章搭建 LinkAce将docker-compose配置迁移到项目目录添加脚本只保留最新备份改为使用宿主机DB获取当前LinkAce数据库备份导入LinkAce数据库备份创建数据库账号修改容器内MySQL客户端连接配置:禁用SSL连接修改 Docker 相关配置回滚和彻底清除数据卷改为使用宿主机…...

Typescript学习教程,从入门到精通,TypeScript 包装类与包装对象语法知识点及案例代码(10)

TypeScript 包装类与包装对象语法知识点及案例代码 在 TypeScript 中&#xff0c;包装类&#xff08;Wrapper Classes&#xff09;和包装对象&#xff08;Wrapper Objects&#xff09;是处理基本数据类型&#xff08;如 Boolean、Number、String&#xff09;的重要概念。这些包…...

若依代码生成

1。数据库&#xff0c;自己先创建好表和数据 启动访问页面&#xff0c;导入你的表 圈红的改成自己的业务名 生成后压缩&#xff0c;执行数据库脚本.sql文件 2。前台导入直接复制粘贴src 3。后台导入 复制main文件夹下的两个文件夹到 ruoyi-admin\src\main 如果不能访问在修改…...

Vue3 打印表格、Element Plus 打印、前端打印、表格导出打印、打印插件封装、JavaScript 打印、打印预览

&#x1f680; Vue3 高级表格打印工具封装&#xff08;支持预览、分页、样式美化&#xff09; 关键词&#xff1a;Vue3 打印表格、Element Plus 打印、前端打印、表格导出打印、打印插件封装、JavaScript 打印、打印预览 在企业级应用中&#xff0c;我们经常遇到打印报表、导出…...

实现一个前端动态模块组件(Vite+原生JS)

1. 引言 在前面的文章《使用Vite创建一个动态网页的前端项目》中我们实现了一个动态网页。不过这个动态网页的实用价值并不高&#xff0c;在真正实际的项目中我们希望的是能实现一个动态的模块组件。具体来说&#xff0c;就是有一个页面控件同时在多个页面中使用&#xff0c;那…...

面向对象编程在 JavaScript 中的实践

引言 前端开发正随着应用复杂度增加而向更严谨的架构模式演进。JavaScript 作为一种多范式语言&#xff0c;其面向对象特性为构建可维护、可扩展的大型应用提供了强大基础。 一、JavaScript 中的对象模型演化 对象字面量&#xff1a;最基础的封装 对象字面量是 JavaScript …...

Android 内存溢出(OOM)的 Kotlin 排查与优化指南

内存溢出&#xff08;Out Of Memory, OOM&#xff09;是 Android 开发中常见且棘手的问题&#xff0c;尤其在处理大图、复杂数据或内存泄漏时。本文将通过 Kotlin 代码示例 和工具使用&#xff0c;提供一套比较完整的排查与优化方案。 一、检测工具&#xff1a;定位内存问题根源…...

Docker常用命令介绍

Docker常用命令 1、本地镜像管理 save 命令 将一个或多个 Docker 镜像保存到一个 tar 归档文件中&#xff0c;以便在其他环境中分发或备份。 # 语法&#xff1a;docker save [OPTIONS] IMAGE [IMAGE...]# 保存单个镜像到文件 docker save -o myimage.tar myimage:latest# 保…...

(高级)高级前端开发者指南:框架运用与综合实战

当您已经掌握了HTML5、CSS3和JavaScript的基础知识后&#xff0c;接下来就是学习现代前端框架和性能优化的高级阶段。本文将重点介绍Vue.js/React的组件化开发、状态管理和路由配置&#xff0c;以及前端性能优化的核心技巧。通过丰富的代码示例和详细讲解&#xff0c;帮助您在实…...

边缘计算正在重新定义物联网的未来——你的设备还在“等云“吗?⚡

“数据不动算法动,算法不动代码动”——这句话正在成为物联网时代的新铁律。 当我们谈论物联网设备性能优化时,大多数开发者第一反应还是"上云"。但现实往往残酷:网络延迟让实时控制变成了"实时等待",带宽成本让企业CFO眉头紧锁,数据安全让合规部门夜…...

std::initialzer_list 与花括号{}数据列表

author: hjjdebug date: 2025年 05月 22日 星期四 15:50:23 CST descrip: std::initialzer_list 与花括号{}数据列表 文章目录 1.{数值列表}是什么?1.1 数组初始化 时 &#xff0c; 称为数组初始化列表1.2. 当用于容器时, 称为容器初始化列表1.3. 对于结构体或类&#xff0c;{…...

C++初阶-list的使用2

目录 1.std::list::splice的使用 2.std::list::remove和std::list::remove_if的使用 2.1remove_if函数的简单介绍 基本用法 函数原型 使用函数对象作为谓词 使用普通函数作为谓词 注意事项 复杂对象示例 2.2remove与remove_if的简单使用 3.std::list::unique的使用 …...

从单链表 list 中删除第 i 个元素--Python

从单链表 list 中删除第 i 个元素 一、问题引入二、解题步骤1.思维导图2.解题步骤 三、代码实现四、个人总结 一、问题引入 请编写程序&#xff0c;将 n 个整数顺次插入一个初始为空的单链表的表头。随后对任意给定的位序 i&#xff0c;删除链表中第 i 个结点。注意&#xff1…...

GraphPad Prism工作表的基本操作

《2025新书现货 GraphPad Prism图表可视化与统计数据分析&#xff08;视频教学版&#xff09;雍杨 康巧昆 清华大学出版社教材书籍 9787302686460 GraphPadPrism图表可视化 无规格》【摘要 书评 试读】- 京东图书 GraphPad Prism中包含5种工作表&#xff0c;每种工作表的基本操…...

C++初阶-list的使用1

目录 1.std::list简介 2.成员函数 2.1构造函数的使用 2.2list::operator的使用 3.迭代器 4.容量 4.1list::empty函数的使用 4.2list::size函数的使用 4.3list::max_size函数的使用 5.元素访问 6.修饰符 6.1list::assign函数的使用 6.2push_back和pop_back和push_fr…...

文献解读-病理影像多模态模型预测乳腺癌新辅助化疗的病理完全反应

期刊&#xff1a;Science Advances 影响因子&#xff1a;11.7&#xff0c;中科院1区Top 发表时间&#xff1a;2025年4月30日 概要&#xff1a;首都医科大学宣武医院放射科卢洁教授团队近日&#xff08;2025年5月&#xff09;在中科院1区top期刊《Sci Adv》&#xff08;IF11.7&a…...

Docker-Mysql

查看容器的详细信息 docker inspect mysql-8.4.5 Docker 启动 local-mysql 的完整命令 docker run -d \--name local-mysql \-e MYSQL_ROOT_PASSWORDyour_root_password \-v /AllenDocker/mysql/data:/var/lib/mysql \-p 3306:3306 \--restart unless-stopped \mysql:8.4.5 验…...

鸿蒙进阶——CMakelist、GN语法简介及三方库通用移植指南

文章大纲 引言一、GN常用的内置变量二、GN常用的内置函数三、CMake 重要语法1、生成动态库2、生成静态库3、生成OBJECT 库4、重要的函数和模块4.1、add_definitions4.2、execute_process4.3、add_dependencies4.4、install4.5、FetchContent 四、GN 重要语法1、编译Target2、预…...

场景化应用实战系列六:检索问答系统

目录 景化应用实战系列六&#xff1a;检索问答系统 一、目标设定 二、关键知识点梳理 三、案例讲解与实战操作 1. 数据准备与预处理 2. 倒排表构建 3. 文本相似度计算 4. 检索问答系统实现 5. 系统优化与改进 一、目标设定 构建一个高效的检索问答系统&#xff0c;能…...

3452. 好数字之和

​题目来源&#xff1a; LeetCode题目&#xff1a;3452. 好数字之和 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 按要求判断求和即可。 解题代码&#xff1a; #python3 class Solution:def sumOfGoodNumbers(self, nums: List[int], k: int) -> int:r…...

GEE数据下载问题记录

GEE下载数据时的一些记录 1. GPT说 2. 验证 在未指定投影坐标系的情况下&#xff0c;下载原始数据导出的是MODIS Sinusoidal投影&#xff0c;如果单纯的对波段值进行操作&#xff0c;不会进行投影转换&#xff0c;如果涉及到波段平均&#xff0c;则会转投影到WGS84坐标系。如…...

P1833 樱花

P1833 樱花 - 洛谷 题目背景 《爱与愁的故事第四弹plant》第一章。 题目的描述 爱与愁大神后院里种了n棵樱花树&#xff0c;每棵都有美学值Ci​(0≤Ci​≤200)。爱与愁大神在每天上学前都会来赏花。爱与愁大神可是生物学霸&#xff0c;他懂得如何欣赏樱花&#xff1a;一种樱…...

文件操作和IO-3 文件内容的读写

文件内容的读写——数据流 流是操作系统提供的概念&#xff0c;Java对操作系统的流进行了封装。 数据流就像水流&#xff0c;生生不息&#xff0c;绵延不断。 水流的特点&#xff1a;比如要100mL的水&#xff0c;可以一次接10mL&#xff0c;分10次接完&#xff0c;也可以一次接…...

Day 0015:Metasploit 基础解析

目录 一、理论学习&#xff08;Metasploit 架构与核心组件&#xff09; 一、架构设计&#xff1a;分层与模块化 基础层&#xff08;Ruby 框架&#xff09;&#xff1a; 核心层&#xff08;模块引擎&#xff09;&#xff1a; 接口层&#xff08;交互界面&#xff09;&#…...

相机标定与图像处理涉及的核心坐标系

坐标系相互关系 #mermaid-svg-QxaMjIcgWVap0awV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QxaMjIcgWVap0awV .error-icon{fill:#552222;}#mermaid-svg-QxaMjIcgWVap0awV .error-text{fill:#552222;stroke:#552…...

单例模式的运用

单例模式实现分析 在我们的向量数据库配置类 MilvusVectorDatabaseConfig 中&#xff0c;采用了单例模式的实现方式&#xff0c;这是一种非常经典且实用的设计模式。 饿汉式单例实现 这种实现方式属于饿汉式单例模式&#xff0c;它的优点在于&#xff1a; // 在类加载时就创…...

PageHelper分页原理解析:从源码到MySQL方言实现

一、引言 分页查询是Web开发的必备功能&#xff0c;MyBatis生态中的PageHelper以其简单易用的特性广受欢迎。本文将从源码层面&#xff08;v5.3.2&#xff09;解析PageHelper的分页实现机制&#xff0c;结合MySQL方言展示完整的执行链路。 二、核心实现原理 1. 插件初始化 …...

MySQL中索引最左前缀法则、索引失效情况、前缀索引、索引设计原则

最左前缀法则 联合索引中&#xff0c;最左前缀法则指的是查询从索引的最左列开始&#xff0c;并且不跳过索引中的列&#xff0c;如果跳跃某一列&#xff0c;索引将会部分失效&#xff08;后面的字段索引失效&#xff09;举例假设有一个联合索引包含三个字段按顺序&#xff1a;…...

pdf图片导出(Visio和Origin)

一、Visio 导入pdf格式图片 1. 设计->大小&#xff0c;适应绘图。 2. 文件->导出&#xff0c;导出为pdf格式。 上面两部即可得到只包含图的部分的pdf格式。 如果出现的有默认白边&#xff0c;可以通过以下方式设置&#xff1a; 1. 文件->选项->自定义功能区->…...

NR 通讯的整体架构

前言&#xff1a; 并假设发射器发送了一个信号&#xff0c;如左下角所示&#xff08;蓝色&#xff09;&#xff0c;接收器检测到的信号显示在右侧&#xff08;红色&#xff09;。您在图中注意到的第一件事是什么&#xff1f;那就是发送的信号和接收的信号并不完全相同。 有什么…...

【大模型面试每日一题】Day 26:从伦理角度,大模型可能存在哪些潜在风险?技术上如何实现内容安全控制(如RLHF、红队测试)?

【大模型面试每日一题】Day 26&#xff1a;从伦理角度&#xff0c;大模型可能存在哪些潜在风险&#xff1f;技术上如何实现内容安全控制&#xff08;如RLHF、红队测试&#xff09;&#xff1f; &#x1f4cc; 题目重现 &#x1f31f;&#x1f31f; 面试官:从伦理角度&#xf…...

第六届电子通讯与人工智能国际学术会议(ICECAI 2025)

在数字化浪潮中&#xff0c;电子通讯与人工智能的融合正悄然重塑世界的运行逻辑。技术基础的共生关系是这场变革的核心——电子通讯如同“信息高速公路”&#xff0c;通过5G等高速传输技术&#xff0c;将海量数据实时输送至AI系统&#xff0c;使其能够像人类神经系统般快速响应…...

深入剖析 5G 核心网中的 PLMN

一、引言 在 5G 技术迅猛发展的当下,5G 核心网作为整个通信系统的关键枢纽,支撑着海量数据传输、低延迟通信以及多样化业务应用。其中,公共陆地移动网络(Public Land Mobile Network,PLMN)扮演着极为重要的角色,它是 5G 核心网实现用户接入、网络管理以及业务提供的基础…...

佰力博科技与您探讨半导体电阻测试常用的一些方法

一、两探针法​ 两探针法是一种较为基础的测试方法。该方法将两根探针与半导体样品表面紧密接触&#xff0c;通过电源在两根探针之间施加电压&#xff0c;同时使用电流表测量通过样品的电流&#xff0c;再根据欧姆定律计算电阻。​这种方法的优点在于操作简单、设备要求较低&a…...

5G 核心网中的 NPN 功能详解

引言 在 5G 技术飞速发展的今天,5G 核心网不断演进,为各类应用场景提供强大支撑。其中,NPN(Non-Public Network,非公共网络)功能作为 5G 核心网的重要特性,正逐渐崭露头角,在众多行业中发挥着关键作用。它为特定用户或组织打造专属网络环境,满足其对网络性能、安全性…...

谷歌medgemma-27b-text-it医疗大模型论文速读:多语言大型语言模型医学问答基准测试MedExpQA

《MedExpQA: 多语言大型语言模型医学问答基准测试》论文解析 一、引言 论文开篇指出大型语言模型&#xff08;LLMs&#xff09;在医学领域的巨大潜力&#xff0c;尤其是在医学问答&#xff08;QA&#xff09;方面。尽管LLMs在医学执照考试等场景中取得了令人瞩目的成绩&#…...

# 深入解析BERT自然语言处理框架:原理、结构与应用

深入解析BERT自然语言处理框架&#xff1a;原理、结构与应用 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;框架的出现无疑是一个重要的里程碑。它凭借其强大的语言表示能…...

js中encodeURIComponent函数使用场景

encodeURIComponent 是 JavaScript 中的一个内置函数&#xff0c;它的作用是&#xff1a; 将字符串编码为可以安全放入 URL 的形式。 ✅ 为什么需要它&#xff1f; URL 中有一些字符是有特殊意义的&#xff0c;比如&#xff1a; ? 用来开始查询参数 & 分隔多个参数 连接…...

【NLP 77、Python环境管理工具之conda】

如果你第一万次否定自己&#xff0c;那我希望我可以一万零一次大声称赞你 —— 25.5.22 一、什么是conda conda是一个开源的包管理系统和环境管理系统&#xff0c;主要用于Python语言&#xff0c;但也可以用于其它语言的项目 二、为什么要使用conda ① 多环境共存&#xff0c;多…...