Socket-UDP
Socket(套接字 )是计算机网络中用于实现进程间通信的重要编程接口,是对 TCP/IP 协议的封装 ,可看作是不同主机上应用进程之间双向通信端点的抽象。以下是详细介绍:
作用与地位
- 作为应用层与传输层、网络层协议间的中间抽象层,屏蔽了网络通信底层如 TCP/IP 协议的复杂细节,让开发者只需通过简单接口就能实现网络通信 。例如开发网络聊天程序时,借助 Socket 接口,无需深入了解网络协议具体实现就能完成消息收发 。
- 向上为应用进程提供数据交换机制,向下连接网络协议栈,是应用程序与网络协议交互的接口。
类型
- 流式套接字(SOCK_STREAM ):基于 TCP 协议 ,提供面向连接、可靠的数据传输服务。通信前需建立连接,保证数据无差错、无重复发送且按序接收,还内置流量控制机制。适用于对数据准确性和顺序要求高的场景,如文件传输、网页浏览、数据库连接等 。
- 数据报套接字(SOCK_DGRAM ):基于 UDP 协议 ,是无连接的,不保证数据可靠传输,数据包可能丢失、重复或乱序。但传输速度快,适合实时性要求高、能容忍少量数据丢失的场景,如视频直播、在线游戏、实时音频通信等 。
- 原始套接字(SOCK_RAW ):允许直接访问较低层次协议,如 IP、ICMP 等 。可用于开发自定义网络协议、网络嗅探、网络攻击检测等特殊网络应用,但使用难度大且需较高权限 。
工作流程(以常见的 C/S 模式为例 )
- 服务端:
- 创建 Socket 对象:调用 socket 函数创建用于监听的套接字 。
- 绑定地址信息:通过 bind 函数将 Socket 与特定 IP 地址和端口号绑定,使服务端在该地址和端口监听 。
- 监听连接请求:使用 listen 函数设置监听队列,准备接受客户端连接 。
- 接受连接:调用 accept 函数阻塞等待,一旦有客户端连接请求,就创建新的 Socket 用于与该客户端通信 。
- 数据交互:通过新 Socket 的 recv 和 send 等函数进行数据接收和发送 。
- 关闭连接:通信结束后,调用 close 函数关闭 Socket 。
- 客户端:
- 创建 Socket 对象:同样调用 socket 函数创建 Socket 。
- 发起连接请求:使用 connect 函数连接到服务端指定的 IP 地址和端口号 。
- 数据交互:连接成功后,用 send 和 recv 等函数进行数据收发 。
- 关闭连接:完成通信后,调用 close 函数关闭 Socket 。
下面代码是对Socket一些接口函数的模拟:
#pragma once#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include"Log.hpp"
#include <string.h>
using namespace std;Log log;
const int backlog=10;//backlog 参数的值决定了服务器可以排队等待处理的最大连接请求数量
enum{SocketError=2,BindError,ListenError,AcceptError
};
class Sock
{
public:Sock(){}~Sock(){}
public:void Socket(){int sockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){log.logmessage(fatal,"socket fail,errno:%d,strerr:%s",errno,strerror(errno));exit(SocketError);}// 通过设置 SO_REUSEADDR 选项 ,使用 setsockopt 函数可以开启端口复用功能,// 允许套接字绑定到处于 TIME_WAIT 状态的端口 ,使得服务器能快速重启并继续使用原端口提供服务 。int opt=1;setsockopt(_sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));log.logmessage(info,"socket success,errno:%d,strerr:%s",errno,strerror(errno));}void Bind(uint16_t port){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;// 开始bindint b=bind(_sockfd,(const sockaddr*)&local,sizeof(local));if(b<0){log.logmessage(fatal,"bind fail,errno:%d,strerr:%s",errno,strerror(errno));exit(BindError);}log.logmessage(info,"bind success,errno:%d,strerr:%s",errno,strerror(errno));}void Listen(){if(listen(_sockfd,backlog)<0){log.logmessage(fatal,"listen fail,errno:%d,strerr:%s",errno,strerror(errno));exit(ListenError);}log.logmessage(info,"listen success,errno:%d,strerr:%s",errno,strerror(errno));}int Accept(string *client_ip,uint16_t *client_port)//带*是输出型参数{struct sockaddr_in client;socklen_t len=sizeof(client);int newfd=accept(_sockfd,(sockaddr*)&client,&len);if(newfd<0){log.logmessage(fatal,"accept fail,errno:%d,strerr:%s",errno,strerror(errno));// exit(AcceptError);return -1;}log.logmessage(info,"accept success,errno:%d,strerr:%s",errno,strerror(errno));char clientIP[64];inet_ntop(AF_INET,&client,clientIP,sizeof(clientIP));*client_ip=clientIP;*client_port=ntohs(client.sin_port);return newfd;}bool Connect(const string&serverip,const uint16_t port){struct sockaddr_in peer;bzero(&peer,sizeof(peer));peer.sin_family=AF_INET;peer.sin_port=htons(port);inet_pton(AF_INET,serverip.c_str(),&(peer.sin_addr));int c=connect(_sockfd,(const sockaddr*)&peer,sizeof(peer));if(c<0){cout<<"Link fail..."<<endl;return false;}return true;}void Close(){close(_sockfd);}int fd(){return _sockfd;}
private:int _sockfd;
};
其中有一个setsockopt这一行代码的目的是:使得服务器能快速重启并继续使用原端口提供服务 。
UDP 的全称是 User Datagram Protocol,即用户数据报协议 ,是 OSI 参考模型中一种无连接的传输层协议 ,提供面向事务的简单不可靠信息传送服务 。它能让应用程序在无需建立连接的情况下,发送封装的 IP 数据包 。
UDP的代码案例:客户端:
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <cstdlib>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <strings.h>
#include <pthread.h>
using namespace std;struct ThreadData
{struct sockaddr_in server;int sockfd;
};void Usage(std::string proc)
{std::cout << "\n\rUsage: " << proc << "serverip serverport\n"<< std::endl;
}
void* recv_message(void*argc)
{ThreadData* td=static_cast<ThreadData*>(argc);char buffer[1024];while(true){struct sockaddr_in tmp;socklen_t len = sizeof(tmp);ssize_t s = recvfrom(td->sockfd, buffer, 1023, 0, (struct sockaddr *)&tmp, &len);if (s > 0){buffer[s] = 0;cout << buffer << endl;}}return nullptr;
}void* send_message(void * argc)
{// int *sockfd=static_cast<int*>(argc);ThreadData* td=static_cast<ThreadData*>(argc);string message;socklen_t len = sizeof(td->server);while(true){cout << "Please Enter@ ";getline(cin, message);// 1. 数据 2. 给谁发sendto(td->sockfd, message.c_str(), message.size(), 0, (struct sockaddr *)&(td->server), len);}return nullptr;
}
int main(int argc, char *argv[])
{if (argc != 3) // 这里就是看main是不是收到了两个参数,一个是程序名一个是端口号!{Usage(argv[0]);exit(0);}string serverip = argv[1];uint16_t serverport = std::stoi(argv[2]);struct ThreadData td;// struct sockaddr_in server;bzero(&td.server, sizeof(td.server));td.server.sin_family = AF_INET;td.server.sin_port = htons(serverport); //?td.server.sin_addr.s_addr = inet_addr(serverip.c_str());// socklen_t len = sizeof(td.server);td.sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (td.sockfd < 0){cout << "socket fail" << endl;return 1;}// client要bind吗?要,但是它不需要显示的进行bind绑定!一般由操作系统进行随机绑定!// 原因就是防止端口号相同导致进程起不来,例如dy开了,ks就开不了!// 其实客户端的port不重要只要它能保证唯一性就可以!// 在系统服务端首次sendto的时候客户端开始绑定pthread_t recv,sender;pthread_create(&recv,nullptr,recv_message,&td);pthread_create(&sender,nullptr,send_message,&td);//对下面单线程进行拆分,让它不会在getline处造成阻塞,解决的办法就是拆分成多线程一个线程进行输出,一个线程用来接收!// string message;// char buffer[1024];// while (true)// {// // cout << "Please Enter@ ";// // getline(cin, message);// // // 1. 数据 2. 给谁发// // sendto(sockfd, message.c_str(), message.size(), 0, (struct sockaddr *)&server, len);// // struct sockaddr_in tmp;// // socklen_t len = sizeof(tmp);// // ssize_t s = recvfrom(sockfd, buffer, 1023, 0, (struct sockaddr *)&tmp, &len);// // if (s > 0)// // {// // buffer[s] = 0;// // cout << buffer << endl;// // }// }pthread_join(recv,nullptr);pthread_join(sender,nullptr);close(td.sockfd);// 一个端口号只能有一个进程进行绑定!!!!return 0;
}
服务端:
#pragma once
#include <iostream>
#include "Log.hpp"
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <functional>
#include <stdio.h>
#include <unordered_map>
using namespace std;using func_t = std::function<std::string(const std::string &, const std::string &, std::uint16_t)>; // 返回值是string参数是const string
extern Log log;
enum
{SOCK_ERROR = 1,BIND_ERROR
};uint16_t defaultport = 8080;
const int size = 1024;
string defaultip = "0.0.0.0"; // 0的ip默认就是接收所有可用网络的信息!
class UdpServer
{
public:UdpServer(const uint16_t &port = defaultport, const string &ip = defaultip) : _port(port), _ip(ip){}void Init(){// 1.创建一个Udp socket// UDP的socket是全双工的!就是允许被同时读写的sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0){log.logmessage(fatal, "socket create fail,socket:%d", sockfd);exit(SOCK_ERROR);}log.logmessage(info, "socket create success,socket:%d", sockfd);// 2.bind socketstruct sockaddr_in _local; // 这个结构体实例出来是用于下面系统调用bind绑定时候告诉os要通信的具体信息bzero(&_local, sizeof(_local));// memset(&_local, 0, sizeof(_local));_local.sin_family = AF_INET; // 表示使用 IPv4 地址族_local.sin_port = htons(_port); // 把我们主机序列转换为端口序列,如果你本身就是大端那不发生变化,如果是小端会自动转换为大端!// 使用htons函数将主机字节序的端口号转换为网络字节序,这样在网络传输时,接收方就能正确解析端口号// _local.sin_addr.s_addr=inet_addr(_ip.c_str());//1.string-》unit32_t 2.他必须是网络序列!_local.sin_addr.s_addr = INADDR_ANY;int n = bind(sockfd, (const sockaddr *)&_local, sizeof(_local));if (n < 0){log.logmessage(fatal, "bind fail,errno:%d ,erron string:%s", errno, strerror(errno));exit(BIND_ERROR);}log.logmessage(info, "bind success,errno:%d ,erron string:%s", errno, strerror(errno));}void CheckUser(const struct sockaddr_in &client, const string &Client_ip1, uint16_t Client_port1){auto iter = onlineUser.find(Client_ip1);if (iter == onlineUser.end()){onlineUser.insert({Client_ip1, client});cout << "[" << Client_ip1 << ": " << Client_port1 << "]Add Online User" << endl;}}void BroadCast(const string &_info, const string &Client_ip1, uint16_t Client_port1){for (const auto &user : onlineUser){std::string message = "[";message += Client_ip1;message += ":";message += std::to_string(Client_port1);message += "]#";message += _info;socklen_t len = sizeof(user.second);sendto(sockfd, message.c_str(), message.size(), 0, (struct sockaddr *)(&user.second), len);}}void Run(func_t func){_isRunning = true;char buffer[size];while (_isRunning){struct sockaddr_in client;socklen_t len = sizeof(client);ssize_t n = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0, (sockaddr *)&client, &len);if (n < 0){log.logmessage(warn, "recvform fail,errno:%d ,erron string:%s", errno, strerror(errno));continue;}uint16_t Client_port1 = ntohs(client.sin_port); // 这是把网络字节序列转换为主机序列// ip地址本身是点分十进制的string Client_ip1 = inet_ntoa(client.sin_addr); // 把ip地址转化为字符串!这里返回的其实是字符串的首地址// 检查用户是新用户?CheckUser(client, Client_ip1, Client_port1);string _info = buffer;BroadCast(_info, Client_ip1, Client_port1);// 接收到数据后--充当一次数据处理// buffer[size]=0;// string _info=buffer;// string echo_string=func(info,Client_ip1,Client_port1);// // string echo_string="server echo##"+_info;// cout<<echo_string<<endl;// // 发送回去// sendto(sockfd,echo_string.c_str(),echo_string.size(),0,(const sockaddr*)&client,len);}}~UdpServer(){if (sockfd > 0){close(sockfd);}}private:int sockfd; // 网络文件描述符!string _ip; // 任意地址绑定就是 全0;uint16_t _port; // 表明服务器进程的端口号!bool _isRunning;unordered_map<string, struct sockaddr_in> onlineUser; // K代表主机ip,V代表的是用户网络信息!
};
main.c:
#include "udpserver.hpp"
#include <memory>
#include <stdio.h>
#include<vector>Log log;
void Usage(std::string proc)
{std::cout << "\n\rUsage: " << proc << " port[1024+]\n"<< std::endl;
}
std::string Handler(const std::string &str,const string &Client_ip1,uint16_t Client_port1 )
{cout<<"["<<Client_ip1<<": "<<Client_port1<<"]##"<<endl;std::string res = "Server get a message: ";res += str;cout << res << endl;return res;
}
bool SafeCheck(const string& cmd)
{int safe=false;std::vector<std::string> key_word = {"rm","mv","cp","kill","sudo","unlink","uninstall","yum","top","while"};for(auto &word:key_word){auto pos=cmd.find(word);if(pos!=string::npos){return false;}}return true;}
std::string ExecuteCommand(const std::string &cmd)
{cout<<"get a request :"<<cmd<<endl;if(!SafeCheck(cmd)) return "Bad Man";FILE *fp = popen(cmd.c_str(), "r");if (nullptr == fp){perror("popen");return "error";}std::string result;char _buffer[4096];while (true){char *r = fgets(_buffer, sizeof(_buffer), fp);if (r == nullptr)break;result += _buffer; // 正确的字符串拼接方式,将读取内容追加到result}pclose(fp);
}
int main(int argc, char *argv[])
{if (argc != 2) // 这里就是看main是不是收到了两个参数,一个是程序名一个是端口号!{Usage(argv[0]);exit(0);}uint16_t port = std::stoi(argv[1]);std::unique_ptr<UdpServer> svr(new UdpServer(port/*,"127.0.0.1"*/));// std::unique_ptr<UdpServer> svr = std::make_unique<UdpServer>(port,"127.0.0.1");svr->Init(/***/);svr->Run(Handler);// svr->Run();return 0;
}
相关文章:
Socket-UDP
Socket(套接字 )是计算机网络中用于实现进程间通信的重要编程接口,是对 TCP/IP 协议的封装 ,可看作是不同主机上应用进程之间双向通信端点的抽象。以下是详细介绍: 作用与地位 作为应用层与传输层、网络层协议间的中…...
【游戏ai】从强化学习开始自学游戏ai-2 使用IPPO自博弈对抗pongv3环境
文章目录 前言一、环境设计二、动作设计三、状态设计四、神经网路设计五、效果展示其他问题总结 前言 本学期的大作业,要求完成多智能体PPO的乒乓球对抗环境,这里我使用IPPO的方法来实现。 正好之前做过这个单个PPO与pong环境内置的ai对抗的训练&#…...
LeRobot 项目部署运行逻辑(三)——机器人及舵机配置
Lerobot 目前的机器人硬件以舵机类型为主,并未配置机器人正逆运动学及运动学,遥操作映射以舵机关节角度为主 因此,需要在使用前需要对舵机各项参数及初始位置进行配置 目录 1 Mobile ALOHA 配置 2 Dynamixel 配置 2.1 配置软件 2.2 SDK …...
Ubuntu20.04安装NVIDIA Warp
Ubuntu20.04安装NVIDIA Warp 安装测试 Warp的gitee网址 Warp的github网址 写在前面:建议安装前先参考readme文件自检系统驱动和cuda是否支持,个人实测建议是python3.9,但python3.8.20也可以使用。 写在前面:后续本人可能会使用这…...
电子病历高质量语料库构建方法与架构项目(临床情景理解模块篇)
引言 随着人工智能技术在医疗健康领域的广泛应用,电子病历(Electronic Medical Records,EMR)作为临床医疗数据的重要载体,已成为医学研究和临床决策支持的关键资源。电子病历高质量语料库的构建为医疗人工智能模型的训练和应用提供了基础支撑,其中临床情境理解模块是连接…...
WPF性能优化举例
WPF性能优化集锦 一、UI渲染性能优化 1. 虚拟化技术 ListView/GridView虚拟化: <ListView VirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling"ScrollViewer.IsDeferredScrollingEnabled=…...
【CUDA pytorch】
ev win10 3050ti 联想笔记本 nvcc --version 得到 PS C:\Users\25515> nvcc --version nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation Built on Tue_May__3_19:00:59_Pacific_Daylight_Time_2022 Cuda compilation tools, release …...
mac下载homebrew 安装和使用git
mac下载homebrew 安装和使用git 本人最近从windows换成mac,记录一下用homebrew安装git的过程 打开终端 command 空格,搜索终端 安装homebrew 在终端中输入下面命令,来安装homebrew /bin/bash -c "$(curl -fsSL https://raw.githu…...
Elasticsearch入门速通01:核心概念与选型指南
一、Elasticsearch 是什么? 一句话定义: 开源分布式搜索引擎,擅长处理海量数据的实时存储、搜索与分析,是ELK技术栈(ElasticsearchKibanaBeatsLogstash)的核心组件。 核心能力: 近实时搜索&…...
应对过度处方挑战:为药物推荐任务微调大语言模型(Xiangnan He)
Abstract 药物推荐系统因其有潜力根据患者的临床数据提供个性化且有效的药物组合,在医疗保健领域备受关注。然而,现有方法在适应不同的电子健康记录(EHR)系统以及有效利用非结构化数据方面面临挑战,导致其泛化能力有限…...
41 python http之requests 库
Python 的requests库就像你的 "接口助手",用几行代码就能发送 HTTP 请求,自动处理复杂的网络交互,让你告别手动拼接 URL 和解析响应的痛苦! 一、快速入门:3 步搞定基本请求 1.1 安装库:一键开启助手功能 pip install requests 1.2 发送 GET 请求 import r…...
百度网盘golang实习面经
goroutine内存泄漏的情况?如何避免? goroutine内存泄漏基本上是因为异常导致阻塞, 可以导致阻塞的情况 1 死锁, goroutine 等待的锁发生了死锁情况 2 chan没有正常被关闭,导致读取读chan的goroutine阻塞 如何避免 1 避免死锁 2 正常关闭 3 使用context管…...
super_small_toy_tpu
super_small_toy_tpu 小狼http://blog.csdn.net/xiaolangyangyang 1、基础框图 2、源码下载: GitHub - dldldlfma/super_small_toy_tpu 3、安装iverilog、vvp、gtkwave windows安装:https://bleyer.org/icarus/ ubuntu安装:sudo ap…...
Redis缓存穿透、缓存击穿与缓存雪崩:如何在.NET Core中解决
在高并发的互联网系统中,缓存技术作为优化系统性能的重要手段,已被广泛应用。然而,缓存系统本身也存在一些常见的问题,尤其是 缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果处理不当,可能导致系统性能严重下降&#x…...
驱动车辆诊断测试创新 | 支持诊断测试的模拟器及数据文件转换生成
一 背景和挑战 | 背景: 随着汽车功能的日益丰富,ECU和域控制器的复杂性大大增加,导致测试需求大幅上升,尤其是在ECU的故障诊断和性能验证方面。然而,传统的实车测试方法难以满足高频率迭代和验证需求,不仅…...
VS Code技巧2:识别FreeCAD对象
在使用VS Code阅读FreeCAD代码或者FreeCAD的工作台代码时,VS Code无法识别FreeCAD对象,会提示Import “FreeCAD” could not be resolved: 问题解决如下几步即可。 第一步:确认 FreeCAD 的 Python 环境路径 在FreeCAD的Python控制…...
泰迪杯特等奖案例学习资料:基于多模态融合与边缘计算的智能温室环境调控系统
(第十二届泰迪杯数据挖掘挑战赛特等奖案例解析) 一、案例背景与核心挑战 1.1 应用场景与行业痛点 在现代设施农业中,温室环境调控直接影响作物产量与品质。传统温室管理存在以下问题: 环境参数耦合性高:温度、湿度、光照、CO₂浓度等参数相互影响,人工调控易顾此失彼。…...
猿人学web端爬虫攻防大赛赛题第13题——入门级cookie
1. F12开发者模式 刷新第一页,仔细研究发现里面有三次请求名为13的请求,根据题目提示cookie关键字,所以主要留意请求和响应的cookie值。 三次请求都带了sessionid,说明存在session(后面写代码要用session来写&#x…...
机器指标监控技术方案
文章目录 机器指标监控技术方案架构图组件简介Prometheus 简介核心特性适用场景 Grafana 简介核心特性适用场景 Alertmanager 简介核心特性适用场景 数据采集机器Node ExporterMySQL ExporterRedis ExporterES ExporterRocketMQ ExporterSpringcloud ExporterNacos 数据存储短期…...
数据库设计理论:从需求分析到实现的全流程解析
引言 在当今信息爆炸的时代,数据已成为企业和组织最宝贵的资产之一。如何有效地组织、存储和管理这些数据,是数据库设计需要解决的核心问题。一个优秀的数据库设计能够提高系统性能,确保数据一致性,降低维护成本,而糟…...
一文详解 Linux下的开源打印系统CUPS(Common UNIX Printing System)
文章目录 前言一、CUPS 简介二、CUPS 常用指令解析2.1 安装 CUPS2.2 启动/重启服务2.3 添加打印机(核心操作)2.4 设置默认打印机2.5 打印文件2.6 查看打印任务2.7 取消打印任务2.8 查看、移除已添加的打印机 三、调试与常见问题3.1 日志查看3.2 驱动问题…...
uniapp打包apk详细教程
目录 1.打apk包前提条件 2.获取uni-app标识 3.进入dcloud开发者后台 4.开始打包 1.打apk包前提条件 1.在HBuilderX.exe软化中,登录自己的账号 2.在dcloud官网,同样登录自己的账号。没有可以免费注册。 2.获取uni-app标识 获取方法:点…...
C++初阶-string类2
目录 1.迭代器 1.1普通迭代器的使用 1.2string::begin 1.3string::end 1.4const迭代器的使用 1.5泛型迭代器和const反向迭代器 1.6string::rbegin 1.6string::rend 1.7string::cbegin、string::cend、string::crbegin、string::crend 与begin/end、rbegin/rend的区别 …...
Qt QComboBox 下拉复选多选(multicombobox)
Qt QComboBox 下拉复选多选(multicombobox),备忘,待更多测试 【免费】QtQComboBox下拉复选多选(multicombobox)资源-CSDN文库...
逻辑回归之参数选择:从理论到实践
在机器学习的广阔领域中,逻辑回归作为一种经典的有监督学习算法,常用于解决分类问题。它以其简单易懂的原理和高效的计算性能,在实际应用中备受青睐。然而,要充分发挥逻辑回归的优势,参数选择是关键环节。本文将结合信…...
10、属性和数据处理---c++17
一、[[fallthrought]] 用途:在 switch 语句中标记某个分支 (case) 故意不写 break,明确告知编译器“执行穿透”是有意为之。 仅在需要向下穿透时使用,且应添加注释说明原因 #include<cstdio> #include<iostream> using namesp…...
conda管理python环境
安装conda 使用anaconda官网安装地址:https://www.anaconda.com/download/success 配置镜像环境 conda config --add channels Index of /anaconda/pkgs/main/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror conda config --add channels Index of /an…...
【Python学习路线】零基础到项目实战系统
目录 🌟 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 🧠 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 💻 二、实战演示环境配置要求核心代码实现运行结果验证 ⚡ 三、性能对比测试方法论量化数据对比…...
C/C++核心机制深度解析:指针、结构体与动态内存管理(面试精要)
C/C核心机制深度解析:指针、结构体与动态内存管理(面试精要) 引言 在系统级编程领域,C/C语言凭借对硬件的直接操作能力和高效的内存管理机制,长期占据主导地位。面试中,指针、结构体和动态内存管理作为三…...
宇树科技举办“人型机器人格斗大赛”
2025 年 5 月至 6 月,一场全球瞩目的科技盛宴 —— 全球首场 “人形机器人格斗大赛”,将由杭州宇树科技盛大举办。届时,观众将迎来机器人格斗领域前所未有的视觉震撼。 为打造最强参赛阵容,宇树科技技术团队在过去数周里…...
getattr 的作用
getattr 是 Python 内置的一个函数,用于“动态地”获取对象的属性。**它允许你在运行时通过属性名称(字符串形式)来访问对象的属性,而不用在代码中直接硬编码属性名。**下面详细介绍该方法的用法和注意事项: ────…...
腾讯云服务器性能提升全栈指南(2025版)
腾讯云服务器性能提升全栈指南(2025版) 一、硬件选型与资源优化 1. 实例规格精准匹配 腾讯云服务器提供计算型CVM、内存型MEM、大数据型Hadoop等12种实例类型。根据业务特性选择: • 高并发Web应用:推荐SA3实例࿰…...
Kotlin与Jetpack Compose的详细使用指南
Kotlin与Jetpack Compose的详细使用指南,综合最新技术实践和官方文档整理: 一、环境配置与基础架构 项目创建 在Android Studio中选择Empty Compose Activity模板,默认生成包含Composable预览的MainActivity2要求Kotlin版本≥1.8.0&…...
潇洒郎: 100% 成功搭建Docker私有镜像仓库并管理、删除镜像
1、Registry Web管理界面 2、拉取Registry-Web镜像 创建配置文件 tee /opt/zwx-registry/web-config.yml <<-EOF registry:url: http://172.28.73.90:8010/v2name: registryreadonly: falseauth:enabled: false EOF 拉取docker-registry-web镜像并绑定Registry仓库 …...
【Spring Boot 注解】@ConfigurationProperties
文章目录 ConfigurationProperties注解一、简介二、依赖引入三、基本用法四、主要特性五、激活方式六,优点七、与 Value 对比 ConfigurationProperties注解 一、简介 ConfigurationProperties 是 Spring Boot 提供的一个强大注解,用于将外部配置&#…...
阿里云服务迁移实战: 06-切换DNS
概述 按前面的步骤,所有服务迁移完毕之后,最后就剩下 DNS 解析修改了。 修改解析 在域名解析处,修改域名的解析地址即可。 如果 IP 已经过户到了新账号,则不需要修改解析。 何确保业务稳定 域名解析更换时,由于 D…...
Java实现归并排序算法
1. 归并排序原理图解 归并排序是一种分治算法,其核心思想是将数组分成两半,分别对这两半进行排序,然后将排序后的两半合并。以下是归并排序的步骤: 1. 分治: - 将数组分成两半。 - 递归地对每半部分进行归并排序。 2. …...
Vue 项目中运行 `npm run dev` 时发生的过程
步骤1:找到「任务说明书」(package.json) 当你输入 npm run dev,系统首先会去查项目的 「任务说明书」(即 package.json 文件),看看 dev 这个任务具体要做什么。 示例代码(package.json 片段)…...
Python3(19)数据结构
在 Python 编程中,数据结构是组织和存储数据的重要方式,合理选择和使用数据结构能显著提升程序的效率和可读性。这篇博客通过丰富的代码示例深入学习 Python3 的数据结构知识,方便日后复习回顾。 一、列表(List) 1.1…...
macOS 安装了Docker Desktop版终端docker 命令没办法使用
macOS 安装了Docker Desktop版终端docker 命令没办法使用 1、检查Docker Desktop能否正常运行。 确保Docker Desktop能正常运行。 2、检查环境变量是否添加 1、添加环境变量 如果环境变量中没有包含Docker的路径,你可以手动添加。首先,找到Docker的…...
VR 汽车线束培训:探索高效学习新路径
在汽车线束生产领域,VR 汽车线束培训对于新员工的成长至关重要,它是一个关键环节,直接影响着生产效率和产品质量。传统的培训方式,通常是新员工在老员工的指导下,通过实际操作来学习线束装配流程。这种方式不仅耗费大量…...
k8s术语之Deployment
Deployment为Pod和Replica Set(下一代Replication Controller)提供声明式更新 您只需要在Deployment中描述您想要的目标状态是什么,Deployment controller就会帮您将Pod和ReplicaSet的实际状态改变到您的目标状态。您可以定义一个全新的Deployment Controller的职责…...
对js的Date二次封装,继承了原Date的所有方法,增加了自己扩展的方法,可以实现任意时间往前往后推算多少小时、多少天、多少周、多少月;
封装js时间工具 概述 该方法继承了 js 中 Date的所有方法;同时扩展了一部分自用方法: 1、任意时间 往前推多少小时,天,月,周;参数1、2必填,参数3可选beforeDate(num,formatter,dateVal); befo…...
17、商品管理:魔药商店运营——React 19 CRUD实现
一、魔药商店的炼金基石 1. 魔药配方契约(数据模型设计) // 预言池契约(Supabase Schema) interface Potion { id: uuid, name: string, effect: healing | transformation | attack, stock: number, moonSensitive: boo…...
2025-04-30 AIGC-如何做短片视频
摘要: 2025-04-30 AIGC-如何做短片视频 如何做短片视频: 一、画图修图 1.保存视频(无水保存) 2.文案提取(提取文案) 3. DeepSeek(提示词) 4.小梦Ai(图片视频) 5.修图Ai 6.扩图Ai 7.养生…...
【自然语言处理与大模型】如何获取特定领域的微调数据集?
在特定领域中,数据集通常由提出需求的一方提供。然而,在某些情况下,如果他们未能提供所需的数据,或者你正在独立开展一个项目,并且需要相应的数据来推进工作,这时你应该怎么办呢?本文提供一种思…...
算法导论第6章思考题
6.3-2 func(A) 1 A.heap-sizeA.len 2 \quad for i ⌊ A . l e n 2 ⌋ \lfloor {A.len\over2}\rfloor ⌊2A.len⌋ downto 1 3 \qquad MAX-HEAPIFY(A,i) 对于第2行的循环控制变量i来说,为啥要求它是从 ⌊ A . l e n 2 ⌋ \lfloor {A.len\over2}\rfloor ⌊2A.len⌋…...
论文阅读:2024 ACM SIGSAC Membership inference attacks against in-context learning
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Membership inference attacks against in-context learning https://arxiv.org/pdf/2409.01380 https://www.doubao.com/chat/4030440311895554 速览 这篇论文主要研究了…...
读论文笔记-CoOp:对CLIP的handcrafted改进
读论文笔记-Learning to Prompt for Vision-Language Models Problems 现有基于prompt engineering的多模态模型在设计合适的prompt时有很大困难,从而设计了一种更简单的方法来制作prompt。 Motivations prompt engineering虽然促进了视觉表示的学习,…...
国产化海光C86架构服务器安装windows实录
最近几年与红蓝关系急转直下,尤其是科技领域尤为突出。随之而来的就是软硬件的国产化大潮。由于行业的原因根据要求必须使用国产化服务器、国产化操作系统、国产化数据库、国产化中间件。虽然闭关锁国断开红蓝联系可以在一定程度激发国产化发展,但是不得…...