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

LinuxSocket套接字编程

1.介绍函数使用

1.创建套接字

int socket(int domain, int type, int protocol);

  • domain:指定协议族,如AF_INET(IPv4)或AF_INET6(IPv6)。

  • type:指定套接字类型,如SOCK_DGRAM(UDP)或SOCK_STREAM(TCP)。

  • protocol:通常设置为0,表示使用默认协议。

返回值:成功时返回一个套接字描述符,失败时返回-1。

2.绑定套接字到一个特定的IP地址和端口号

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

  • sockfd:由socket()返回的套接字描述符。

  • addr:指向sockaddr结构的指针,包含要绑定的地址信息。

  • addrlenaddr的长度。

返回值:成功时返回0,失败时返回-1。

3.从UDP套接字接收数据,获取发送方地址

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

  • sockfd:套接字描述符。

  • buf:用于存储接收到的数据的缓冲区。

  • len:缓冲区的大小。

  • flags:通常设置为0。

  • src_addr:指向sockaddr结构的指针,用于存储发送方的地址信息。

  • addrlen:指向socklen_t的指针,用于指定src_addr的长度。

4.向指定的地址发送数据

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

  • sockfd:套接字描述符。

  • buf:要发送的数据的缓冲区。

  • len:要发送的数据的长度。

  • flags:通常设置为0。

  • dest_addr:指向sockaddr结构的指针,包含目标地址信息。

  • addrlendest_addr的长度。

5.设置套接字选项

 int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

  • sockfd:套接字描述符。

  • level:选项级别,如SOL_SOCKET

  • optname:选项名称,如SO_REUSEADDRSO_REUSEPORT

  • optval:指向选项值的指针。

  • optlen:选项值的长度。

返回值:成功时返回0,失败时返回-1。

6.将网络字节序的IP地址转换为点分十进制

char *inet_ntoa(struct in_addr in);

 hostshort:主机字节序的无符号短整数

返回值:网络字节序的无符号短整数。

7.将主机字节序的无符号整数转换为网络字节序

uint16_t htons(uint16_t hostshort);

  • hostshort:主机字节序的无符号短整数。

返回值:网络字节序的无符号短整数。

8.将网络字节序的无符号整数转换为主机字节序

uint16_t ntohs(uint16_t netshort);

 

  • netshort:网络字节序的无符号短整数。

netstate指令查看状态

etstat命令是一个功能强大的网络工具,用于查看和分析系统的网络状态。以下是netstat命令的一些常用选项和示例,帮助你查看网络连接状态:

常用选项

  1. -a:显示所有活动的网络连接,包括监听和非监听状态。

  2. -t:仅显示TCP协议相关的连接。

  3. -u:仅显示UDP协议相关的连接。

  4. -n:以数字形式显示地址和端口号,避免进行DNS解析。

  5. -l:仅显示监听状态的连接。

  6. -p:显示与网络连接相关联的进程ID和程序名称。

  7. -r:显示路由表信息。

  8. -i:显示网络接口统计信息。

类比理解:bind 就像「分配电话号码」​

假设你的程序是一个「电话」,网络通信需要两件事:

  1. 电话号码​(IP地址 + 端口):别人通过这个号码找到你。
  2. 电话机​(套接字):用来接听和拨打电话的工具。

bind 的作用
把你的「电话机」绑定到一个「电话号码」上。这样,别人(其他程序)才能通过这个号码联系到你。

2.实现socket通信

 1.服务端构造函数

要接收一个端口号,以及一个处理信息的函数,然后isrunning是一个判断执行状态,true表示运行中,就可以执行主体代码。

   UdpServer(uint16_t port,func_t func):_sockfd(defaultfd),_port(port),_isrunning(false),_func(func){}

 2.服务端初始化函数

创建端口号,设定为UDP模式(虽然第三参数为0,但是前两个参数就决定了模式是UDP的),setsockopt函数用来这个原因是,当服务器主动关闭连接的时候,套接字会进入TIME_WAIT状态,这个原因是,当服务器主动关闭连接的时候,套接字会进入TIME_WAIT状态,可以设置一下地址端口重用,不然就会打印出日志bind error信息。bero函数是吧给定的空间进行初始化为0,接着就是初始化协议族为四字节,然后端口号要转成网络字节序,然后设置套接字绑定的ip地址为INADDR_ANY,表示该套接字将监听所有可用的网络接口上的链接请求,INADDR_ANY是一个常量,,表示任何可用的网络接口,这样子设置是为了把所有的客户端信息接收了,客户端可能是各种网络的,所以设置这个可用全部接收,接着就是绑定套接字了,因为是在栈区上创建的,是在用户层面上,需要到内核态里,就需要bind函数来进行绑定,绑定后的套接字才是有用的。

 void Init(){_sockfd=socket(AF_INET,SOCK_DGRAM,0);if(_sockfd<0){LOG(LogLevel::FATAL)<<"socket error";exit(1);}int opt = 1;setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt));LOG(LogLevel::INFO)<<"socket success, sockfd:"<<_sockfd;struct sockaddr_in local;bzero(&local,sizeof(local));local.sin_family=AF_INET;local.sin_port=htons(_port);local.sin_addr.s_addr=INADDR_ANY;int n=bind(_sockfd,(struct sockaddr*)&local,sizeof(local));if(n<0){LOG(LogLevel::FATAL)<<"bind error";exit(2);}LOG(LogLevel::INFO)<<"bind success,sockfd:"<<_sockfd;}

3.服务端开始函数

 进入这个函数就可以把运行状态设置为true,然后进入循环,设置buffer用来接收消息,创建sockaddr_in类型peer表示客户端的消息(如端口号和IP地址),因为recvfrom函数需要这个参数,这个函数是在UDP套接字接收数据,peer就是一个输出型参数,执行完后,可以从peer里知道是谁发的,就像信封,上面有发件人的信息,需要注意的是参数需要强转成sockaddr类型的,接收成功就进入判断,从peer结构体里可以得到客户端信息(访问成员变量),然后用inet_ntoa将网络字节序转成点分十进制,调用回调函数,把buffer传过去,得到的信息处理再返回,最后执行sendto函数把信息进行发送回去,告诉客户端已经接收到了这个信息。

在使用recvfrom函数时,需要将sockaddr_in强制转换为sockaddr类型,原因如下:

兼容性

  • sockaddr是一个通用的套接字地址结构体,用于支持多种协议族。sockaddr_in是internet环境下套接字的地址形式,专门用于IPv4地址。

  • 套接字函数如bindconnectrecvfrom等设计为使用通用的sockaddr结构体作为参数,以便能够支持不同的地址族。通过将sockaddr_in强制转换为sockaddr,可以确保这些函数能够接受IPv4地址信息,同时保持接口的一致性。

灵活性

  • 强制转换允许程序员在需要时传递特定的地址结构体,同时保持函数接口的通用性。这意味着,如果将来需要支持其他类型的地址(如IPv6地址sockaddr_in6),只需更改地址结构体的类型和相应的转换,而无需修改函数调用的代码。

统一性

  • sockaddrsockaddr_in的长度都是16个字节,因此可以互相转换。这种统一的内存布局使得在不同地址类型之间进行转换成为可能,而不会导致数据损坏或访问错误的内存区域。

void Start(){_isrunning=true;while(_isrunning){char buffer[1024];struct sockaddr_in peer;socklen_t len=sizeof(peer);std::cout << "服务器开始接收数据: " << std::endl;ssize_t s=recvfrom(_sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&peer,&len);if(s>0){std::cout<<"进入判断"<<std::endl;int peer_port=ntohs(peer.sin_port);std::string peer_ip=inet_ntoa(peer.sin_addr);buffer[s]=0;std::cout << "buffer: " << buffer << std::endl;std::string result=_func(buffer);std::cout << "result: "  <<result << std::endl;sendto(_sockfd,result.c_str(),result.size(),0,(struct sockaddr*)&peer,len);}}}std::string defaulthandler(const std::string& message)
{std::cout<<"打印"<<std::endl;std::string hello="hello, ";hello+=message;return hello;
}

4.UdpServer.hpp文件总代码

#pragma once#include <iostream>
#include <string>
#include <functional>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "Log.hpp"using namespace LogModule;using func_t =std::function<std::string(const std::string&)>;const int defaultfd=-1;class UdpServer
{
public:UdpServer(uint16_t port,func_t func):_sockfd(defaultfd),_port(port),_isrunning(false),_func(func){}void Init(){_sockfd=socket(AF_INET,SOCK_DGRAM,0);if(_sockfd<0){LOG(LogLevel::FATAL)<<"socket error";exit(1);}int opt = 1;setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt));LOG(LogLevel::INFO)<<"socket success, sockfd:"<<_sockfd;struct sockaddr_in local;bzero(&local,sizeof(local));local.sin_family=AF_INET;local.sin_port=htons(_port);local.sin_addr.s_addr=INADDR_ANY;int n=bind(_sockfd,(struct sockaddr*)&local,sizeof(local));if(n<0){LOG(LogLevel::FATAL)<<"bind error";exit(2);}LOG(LogLevel::INFO)<<"bind success,sockfd:"<<_sockfd;}void Start(){_isrunning=true;while(_isrunning){char buffer[1024];struct sockaddr_in peer;socklen_t len=sizeof(peer);std::cout << "服务器开始接收数据: " << std::endl;ssize_t s=recvfrom(_sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&peer,&len);if(s>0){std::cout<<"进入判断"<<std::endl;int peer_port=ntohs(peer.sin_port);std::string peer_ip=inet_ntoa(peer.sin_addr);buffer[s]=0;std::cout << "buffer: " << buffer << std::endl;std::string result=_func(buffer);std::cout << "result: "  <<result << std::endl;sendto(_sockfd,result.c_str(),result.size(),0,(struct sockaddr*)&peer,len);}}}~UdpServer(){}
private:int _sockfd;uint16_t _port;bool _isrunning;func_t _func;};

5.实例实现

main要写命令行参数,要接收端口号,不用IP地址是因为前面设置0地址为IP地址,就不需要接收这个参数了,创建一个port接收传入的端口号,这里的uint_16是一个重定义的变量,设置日志类型向控状态打印信息,std::unique_ptr是一个智能指针,用于管理动态分布的对象,它所管理的对象只能有一个所有者,std::make_unique是C++14引入的一个工厂函数,用于简化unique_ptr的创建过程,会调用new操作符来分配空间,返回一个unique_ptr对象。创建对象执行,这里不是.而是->是因为这是一个智能指针,所以需要箭头调用函数。

#include <iostream>
#include <memory>
#include "UdpServer.hpp"
#include <functional> 
std::string defaulthandler(const std::string& message)
{std::cout<<"打印"<<std::endl;std::string hello="hello, ";hello+=message;return hello;
}int main(int argc,char* argv[])
{if(argc!=2){std::cerr<<"Usage:"<<argv[0]<<" port"<<std::endl;return 1;}uint16_t port=std::stoi(argv[1]);Enable_Console_Log_Strategy();std::unique_ptr<UdpServer> usvr=std::make_unique<UdpServer>(port, defaulthandler);usvr->Init();usvr->Start();return 0;
}

6.客户端实现

客服端的话需要传入地址和端口号,创建套接字,以及sockaddr_in类型变量,初始化创建的sockaddr_in结构体的值,进入循环创建string类型的input,要发送的信息,调用getline函数从cin输入流中获取信息放到input中,调用sendto函数向服务端发送消息,套接字,以及发送内容以及大小,还有向谁发送信息,以及信息大小这些参数,然后就是创建buffer来接收消息,向服务端发送消息,服务端反馈后,客服端接收,接收到就打印出接收的消息。

为什么需要传递sizeof(server)

  • 指定地址结构体的大小addrlen参数用于告诉sendto函数目标地址结构体的大小。这对于底层网络库正确解析地址信息至关重要。

  • 兼容性sockaddr是一个通用的地址结构体,而sockaddr_in是专门用于IPv4的地址结构体。通过传递sizeof(server),可以确保sendto函数知道它正在处理的是sockaddr_in结构体的大小。

#include <iostream>
#include <string>
#include <cstring>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>int main(int argc,char* argv[])
{if(argc!=3){std::cerr<<"Usage:"<<argv[0]<<"server_ip server_port"<<std::endl;return 1;}std::string server_ip=argv[1];uint16_t server_port=std::stoi(argv[2]);int sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd<0){std::cerr<<"socket error"<<std::endl;return 2;}struct sockaddr_in server;memset(&server,0,sizeof(server));server.sin_family=AF_INET;server.sin_port=htons(server_port);server.sin_addr.s_addr=inet_addr(server_ip.c_str());while(true){std::string input;std::cout<<"Please Enter#";std::getline(std::cin,input);std::cout << "客户端发送数据: " << input.c_str() << std::endl;ssize_t n=sendto(sockfd,input.c_str(),input.size(),0,(struct sockaddr*)&server,sizeof(server));(void)n;char buffer[1024];struct sockaddr_in peer;socklen_t len=sizeof(peer);ssize_t m=recvfrom(sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&peer,&len);if(m>0){buffer[m]=0;std::cout<<buffer<<std::endl;}}return 0;
}

Makefile文件

.PHONY:all
all:udpclient udpserverudpclient:UdpClient.ccg++ -o $@ $^ -std=c++17 
udpserver:UdpServer.ccg++ -o $@ $^ -std=c++17.PHONY:clean
clean:rm -f udpclient udpserver

相关文章:

LinuxSocket套接字编程

1.介绍函数使用 1.创建套接字 int socket(int domain, int type, int protocol); domain&#xff1a;指定协议族&#xff0c;如AF_INET&#xff08;IPv4&#xff09;或AF_INET6&#xff08;IPv6&#xff09;。 type&#xff1a;指定套接字类型&#xff0c;如SOCK_DGRAM&#…...

青少年编程考试 CCF GESP Python五级认证真题 2025年3月

Python 五级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 A A A B D B A D A D C A A D B 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 链表不具备的特点是( )。 A. 可随机访问任何一个元素 B. 插入、删除操作不需要移动元素 C…...

Java-对比两组对象找出发生变化的字段工具-支持枚举映射-支持时间-支持显示对应字段中文描述-嵌套list等场景

实体字段比较器&#xff08;对比两组对象找出发生变化的字段工具类开发&#xff09; 支持枚举映射 支持时间 支持显示对应字段中文描述 支持嵌套list等场景 下载地址&#xff1a; Java-对比两组对象找出发生变化的字段工具-支持枚举映射-支持时间-支持显示对应字段中文描述-嵌…...

电影舆情分析可视化平台管理端实现

电影舆情分析可视化平台管理端实现 系统概述 本系统的用户主要有三类&#xff0c;游客、普通用户以及电影从业人员。 面向游客和普通用户的是电影网站&#xff0c;系统提供一个便捷的平台&#xff0c;供普通用户搜索和了解电影的基本信息&#xff0c;支持电影预告片播放&…...

【Linux】进程信号(下)

在上一篇中&#xff0c;我们详细探讨了信号的预备知识和产生方式&#xff08;如硬件异常、终端输入、kill命令、系统调用等&#xff09;及其背后的操作系统行为。信号作为进程间异步通信的核心机制&#xff0c;其生命周期远不止“产生”这一环节——信号的保存与处理才是实现可…...

华为数字芯片机考2025合集2已校正

单选 1. 题目内容 关于亚稳态的描述错误的是&#xff08; &#xff09;。 1. 解题步骤 1.1 理解亚稳态&#xff08;Metastability&#xff09;的核心特性 亚稳态是指触发器无法在指定时间内稳定输出有效逻辑电平&#xff08;0或1&#xff09;的状态&#xff0c;其关键特点…...

【大模型微调】如何解决llamaFactory微调效果与vllm部署效果不一致如何解决

以下个人没整理太全 一、生成式语言模型的对话模板介绍 使用Qwen/Qwen1.5-0.5B-Chat训练 对话模板不一样。回答的内容就会不一样。 我们可以看到例如qwen模型的tokenizer_config.json文件&#xff0c;就可以看到对话模板&#xff0c;一般同系列的模型&#xff0c;模板基本都…...

基于视觉语言模型的机器人实时探索系统!ClipRover:移动机器人零样本视觉语言探索和目标发现

作者&#xff1a;Yuxuan Zhang 1 ^{1} 1, Adnan Abdullah 2 ^{2} 2, Sanjeev J. Koppal 3 ^{3} 3, and Md Jahidul Islam 4 ^{4} 4单位&#xff1a; 2 , 4 ^{2,4} 2,4佛罗里达大学电气与计算机工程系RoboPI实验室&#xff0c; 1 , 3 ^{1,3} 1,3佛罗里达大学电气与计算机工程系F…...

Java常用工具算法-6--秘钥托管云服务AWS KMS

前言&#xff1a; 之前我们介绍了一些常用的加密算法&#xff08;如&#xff1a;对称加密AES&#xff0c;非对称加密RSA&#xff0c;ECC等&#xff09;&#xff0c;不论是哪一种都需要涉及到秘钥的管理。通常的做法都是把秘钥放到配置文件中进行配置&#xff0c;但是对于一些高…...

Shell脚本的学习

编写脚本文件 定义以开头&#xff1a;#!/bin/bash #!用来声明脚本由什么shell解释&#xff0c;否则使用默认shel 第一步&#xff1a;编写脚本文件 #!/bin/bash #注释 echo "这是输出" 第二步&#xff1a;加上执行权限&#xff1a;chmod x 脚本文件名.sh 第三步&…...

Java——pdf增加水印

文章目录 前言方式一 itextpdf项目依赖引入编写PDF添加水印工具类测试效果展示 方式二 pdfbox依赖引入编写实现类效果展示 扩展1、将inputstream流信息添加水印并导出zip2、部署出现找不到指定字体文件 资料参考 前言 近期为了知识库文件导出&#xff0c;文件数据安全处理&…...

Redis过期key处理、内存淘汰策略与缓存一致性策略实践方案

在现代的高性能应用开发中&#xff0c;Redis作为一款极为热门的内存数据库&#xff0c;其快速的读写性能和丰富的数据结构使其在缓存、消息队列等诸多领域得到了广泛应用。然而&#xff0c;在实际使用过程中&#xff0c;处理好Redis过期key、选择合适的内存淘汰策略以及确保缓存…...

深入 C++ 线程库:从创建到同步的探索之旅

C在<thread>中定义了C线程库. 创建多线程 #include <iostream> #include <thread> using namespace std; void show(int id, int count) { //线程函数for (int i 0; i < count; i) {cout << "id:" << id << ",值:&qu…...

LangChain使用大语言模型构建强大的应用程序

LangChain简介 LangChain是一个强大的框架&#xff0c;旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#xff…...

程序化广告行业(72/89):Tag Manager系统代码操作与行业发展剖析

程序化广告行业&#xff08;72/89&#xff09;&#xff1a;Tag Manager系统代码操作与行业发展剖析 大家好&#xff01;在技术领域不断探索的过程中&#xff0c;我深刻体会到知识共享的重要性。写这篇博客&#xff0c;就是希望能和大家一起深入了解程序化广告行业&#xff0c;…...

数据结构实验3.3:求解迷宫路径问题

文章目录 一&#xff0c;问题描述二&#xff0c;基本要求三&#xff0c;算法分析&#xff08;一&#xff09;整体思路&#xff08;二&#xff09;详细步骤1. 输入迷宫大小并生成迷宫2. 定义走步规则3. 深度优先搜索&#xff08;DFS&#xff09;4. 输出结果 &#xff08;三&…...

基于SpringBoot的线上历史馆藏系统【附源码】

基于SpringBoot的线上历史馆藏系统&#xff08;源码L文说明文档&#xff09; 4 系统设计 系统在设计的过程中&#xff0c;必然要遵循一定的原则才可以&#xff0c;胡乱设计是不可取的。首先用户在使用过程中&#xff0c;能够直观感受到功能操作的便利性&#xff0c;符合…...

Mybatis的springboot项目使用

删除数据 & 占位符 一般常用占位符进行数据库操作&#xff0c;也就是预编译sql。 在UserMapper中定义删除接口 /** 根据id删除用户*/ Delete("delete from user where id #{id}") void deleteById(Integer id);若想要获取返回值&#xff0c;声明为Integer (s…...

网站集群批量管理-Ansible剧本与变量

复盘内容&#xff1a;链接指北 查看ansible命令文档 ansible-doc -s systemd一、剧本 何为剧本: playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量 剧本yaml格式,yaml格式的文件:空格,冒号. 剧本未来我们批量管理,运维必会的内容. …...

HOW - React Developer Tools 调试器

目录 React Developer Tools使用Components 功能特性1. 查看和编辑 props/state/hooks2. 查找组件3. 检查组件树4. 打印组件信息5. 检查子组件 Profiler 功能特性Commit ChartFlame Chart 火焰图Ranked Chart 排名图 why-did-you-render 参考文档&#xff1a; React调试利器&a…...

Spring Cloud Alibaba微服务治理实战:Nacos+Sentinel深度解析

一、引言 在微服务架构中&#xff0c;服务发现、配置管理、流量控制是保障系统稳定性的核心问题。Spring Cloud Netflix 生态曾主导微服务解决方案&#xff0c;但其部分组件&#xff08;如 Eureka、Hystrix&#xff09;已进入维护模式。 Spring Cloud Alibaba 凭借 高性能、轻…...

《AI换脸时代的攻防暗战:从技术滥用走向可信未来》

技术迭代图谱 过去五年里&#xff0c;Deepfake技术经历了飞速迭代&#xff0c;从最初的萌芽到如今的广泛应用和对抗措施形成。2017年前后&#xff0c;利用深度学习进行人脸换装的技术首次在社区中出现。一位Reddit网友昵称“deepfakes”&#xff0c;将名人面孔替换到色情影片上…...

25/4/9 算法笔记 DBGAN+强化学习+迁移学习实现青光眼图像去模糊1

整体实验介绍 实验主要是结合DBGAN对抗网络强化学习增强迁移学习增强实现青光眼图像去模糊。今天则是先完成了DBGAN板块模型的训练。 实验背景介绍 青光眼的主要特征有&#xff1a; 视盘形态与杯盘比CDR&#xff1a;青光眼患者主要表现为视杯扩大&#xff0c;盘沿变窄。 视…...

【Claude AI大语言模型连接Blender生成资产】Windows安装Blender MCP教程

前言 最近在学习资产制作&#xff0c;了解到了个好玩的东西&#xff0c;利用AI一步一步搭建资产&#xff1a; 上面这副图就是利用Claude AI调用Blender的Python接口一步一步实现的&#xff0c;挺丑但好玩。 安装教程 进入Github: Blender-MCP 网站&#xff0c;下载该项目&a…...

JSP运行环境安装及常用HTML标记使用

制作一个静态网站的基本页面index.html 实验代码&#xff1a;<form> <label for"username">用户名:</label> <input type"text" id"username" name"username"><br> <label for"password&…...

Git 的进阶功能和技巧

1、分支的概念和使用 1.1、什么是分支&#xff1f; 分支&#xff08;Branch&#xff09;是在版本控制中非常重要的概念。几乎所有版本控制系统都支持某种形式的分支。在 Git 中&#xff0c;分支是 Git 强大功能之一&#xff0c;它允许我们从主开发线分离出来&#xff0c;在不…...

WSL1升级到WSL2注意事项

今天要在WSL上安装docker&#xff0c;因为机器上安装了wsl1&#xff0c;docker安装后启动不了&#xff0c;通过询问deepseek发现docker只能在wsl2上安装&#xff0c;因此就想着将本机的wsl1升级到wsl2。 确保你的 Windows 系统是 Windows 10&#xff08;版本 1903 及以上&…...

392. 判断子序列

https://leetcode.cn/problems/is-subsequence/?envTypestudy-plan-v2&envIdtop-interview-150因为是子序列我们只要关心后一个字符在前一个字符后面出现过就行&#xff0c;至于在哪出现出现几次我们不关心&#xff0c;所以我们可以用HashMap<Character, ArrayList<…...

在 VMware 中为 Ubuntu 24.04 虚拟机设置共享文件夹后,在虚拟机中未能看到共享的内容

在 VMware 中为 Ubuntu 24.04 虚拟机设置共享文件夹后&#xff0c;如果在虚拟机中未能看到共享的内容&#xff0c;可能是由于以下原因&#xff1a; VMware Tools 未正确安装&#xff1a;共享文件夹功能依赖于 VMware Tools 或 Open VM Tools。如果未安装或安装不完整&#xff0…...

台式电脑插入耳机没有声音或麦克风不管用

目录 一、如何确定插孔对应功能1.常见音频插孔颜色及功能2.如何确认电脑插孔?3.常见问题二、 解决方案1. 检查耳机连接和设备选择2. 检查音量设置和静音状态3. 更新或重新安装声卡驱动4. 检查默认音频格式5. 禁用音频增强功能6. 排查硬件问题7. 检查系统服务8. BIOS设置(可选…...

Windchill开发-WTContainer相关API整理

Windchill开发-WTContainer相关API整理 概述各容器对象相关方法站点容器组织容器产品容器/存储库容器上下文团队角色组 文件夹 方法汇总 概述 Windchill 的环境由一组容器组成&#xff0c;容器分为三级&#xff1a;第一级为站点容器&#xff0c;第二级为组织容器&#xff0c;第…...

理解JSON-RPC 2.0 协议

JSON-RPC 2.0是指一种基于 JSON 的远程过程调用协议&#xff0c;用于在网络上进行跨平台和跨语言的通信。它提供了一种简单、轻量级的方式来实现客户端和服务器之间的方法调用和数据交换。在原文中&#xff0c;JSON-RPC 2.0被用来描述 STDIO 传输机制中消息的格式&#xff0c;即…...

【 C# 使用 MiniExcel 库的典型场景】

以下是 C# 使用 MiniExcel 库的典型场景及代码示例&#xff1a; 一、基础读取操作 强类型读取‌&#xff08;需定义数据模型类&#xff09; 定义与 Excel 列名匹配的类后直接映射为对象集合&#xff1a; csharp Copy Code public class UserAccount { public int Id { get; …...

创建 Pod 失败,运行时报错 no space left on device?

遇到创建Pod失败并报错“no space left on device”时&#xff0c;请按照以下步骤排查和解决问题&#xff1a; 1. 定位问题来源 查看Pod事件&#xff1a; kubectl describe pod <pod-name> -n <namespace> 在输出中查找 Events 部分&#xff0c;确认错误是否与…...

[leetcode]查询区间内的所有素数

一.暴力求解 #include<iostream> #include<vector> using namespace std; vector<int> result; bool isPrime(int i) { if (i < 2) return false; for (int j 2;j * j < i;j) { if (i % j 0) { …...

【Web安全】如何在 CDN 干扰下精准检测 SSRF?Nuclei + Interactsh 实战

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 背景 在日常漏洞复核中&#xff0c;我们常用 DNSLog 平台判断目标是否存在 SSRF 漏洞&#xff1a;只要请…...

输入框只能输入非中文字符

在 Qt 中&#xff0c;可以通过设置输入法过滤器&#xff08;QInputContext&#xff09;或使用正则表达式来限制输入框&#xff08;QLineEdit 或 QTextEdit&#xff09;只能输入非中文字符。以下是两种实现方法&#xff1a; ### 方法 1&#xff1a;使用正则表达式 可以通过 QLi…...

LeeCode 136. 只出现一次的数字

给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入&#xff1…...

Traefik应用:配置容器多个网络时无法访问问题

Traefik应用&#xff1a;配置容器多个网络时无法访问问题 介绍解决方法问题原因&#xff1a; **容器多网络归属导致 Traefik 无法正确发现路由规则**。解决方案方法 1&#xff1a;将应用容器 **仅连接** 到 traefik-public 网络方法 2&#xff1a;显式指定 Traefik 监听的网络 …...

超便捷超实用的文档处理工具,PDF排序,功能强大,应用广泛,无需下载,在线使用,简单易用快捷!

小白工具https://www.xiaobaitool.net/files/pdf-sort/ 中的 PDF 排序功能是一项便捷实用的文档处理服务&#xff0c;以下是其具体介绍&#xff1a; 操作便捷直观&#xff1a;用户上传 PDF 文件后&#xff0c;可通过直接拖动页面缩略图来调整顺序&#xff0c;就像在纸质文档中…...

zsh: command not found - 鸿蒙 HarmonyOS Next

终端中执行 hdc 命令抛出如下错误; zsh: command not found 解决办法 首先,查找到 DevEco-Studio 的 toolchains 目录路径; 其次,按照类似如下的文件夹层级结果推理到 toolchains 子级路径下,其中 sdk 后一级的路径可能会存在差异,以实际本地路径结构为主,直至找到 openharm…...

【动态规划】 深入动态规划—两个数组的dp问题

文章目录 前言例题一、最长公共子序列二、不相交的线三、不同的子序列四、通配符匹配五、交错字符串六、两个字符串的最小ASCII删除和七、最长重复子数组 结语 前言 问题本质 它主要围绕着给定的两个数组展开&#xff0c;旨在通过对这两个数组元素间关系的分析&#xff0c;找出…...

金融数据分析(Python)个人学习笔记(7):网络数据采集以及FNN分类

一、网络数据采集 证券宝是一个免费、开源的证券数据平台&#xff08;无需注册&#xff09;&#xff0c;提供大盘准确、完整的证券历史行情数据、上市公司财务数据等&#xff0c;通过python API获取证券数据信息。 1. 安装并导入第三方依赖库 baostock 在命令提示符中运行&…...

指定运行级别

linux系统下有7种运行级别,我们需要来了解一下常用的运行级别,方便我们熟悉以后的部署环境,话不多说,来看. 开机流程&#xff1a; 指定数级别 基本介绍 运行级别说明: 0:关机 相当于shutdown -h now ⭐️默认参数不能设置为0,否则系统无法正常启动 1:单用户(用于找回丢…...

7.第二阶段x64游戏实战-string类

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;7.第二阶段x64游戏实战-分析人物属性 string类是字符串类&#xff0c;在计算机中…...

【MySQL基础】左右连接实战:掌握数据关联的完整视图

1 左右连接基础概念 左连接(left join)和右连接(right join)是MySQL中两种重要的表连接方式&#xff0c;它们与内连接不同&#xff0c;能够保留不匹配的记录&#xff0c;为我们提供更完整的数据视图。 核心区别&#xff1a; left join&#xff1a;保留左表所有记录&#xff0c;…...

建筑工程行业如何选OA系统?4大主流产品分析

工程行业项目的复杂性与业务流程的繁琐性对办公效率提出了极高要求。而OA 系统&#xff08;办公自动化系统&#xff09;的出现&#xff0c;为工程企业提供了一种全新的、高效的管理模式。 工程行业OA系统选型关键指标 功能深度&#xff1a;项目管理模块完整度、文档版本控制能…...

动态科技感html导航网站源码

源码介绍 动态科技感html导航网站源码&#xff0c;这个设计完美呈现了科幻电影中的未来科技界面效果&#xff0c;适合展示技术类项目或作为个人作品集的入口页面&#xff0c;自适应手机。 修改卡片中的链接指向你实际的HTML文件可以根据需要调整卡片内容、图标和颜色要添加更…...

CLIPGaze: Zero-Shot Goal-Directed ScanpathPrediction Using CLIP

摘要 目标导向的扫描路径预测旨在预测人们在搜索视觉场景中的目标时的视线移动路径。大多数现有的目标导向扫描路径预测方法在面对训练过程中未出现的目标类别时,泛化能力较差。此外,它们通常采用不同的预训练模型分别提取目标提示和图像的特征,导致两者之间存在较大的特征…...

wsl-docker环境下启动ES报错vm.max_map_count [65530] is too low

问题描述 在windows环境下用Docker Desktop&#xff08;wsl docker&#xff09;启动 elasticsearch时报错 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]解决方案 方案一 默认的vm.max_map_count值是65530,而es需要至少262…...