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

计算机网络(2) --- 网络套接字UDP

计算机网络(1) --- 网络介绍_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131967378?spm=1001.2014.3001.5501

目录

1.端口号

2.TCP与UDP协议

1.TCP协议介绍

1.TCP协议

2.UDP协议

3.理解

2.网络字节序

发送逻辑

3.socket

1.介绍

2.sockaddr结构

4.UDP协议编程

1.接口介绍

1.创建套接字

2.绑定IP和PORT接口

3.IP介绍

4.网络情况

5.执行接口

5.UPD的服务器和客户端接口实现

1.服务端

1.成员函数

2.接口

3.main函数

4.回调函数

2.客户端

1.成员函数

2.接口

3.main函数


1.端口号

1.IP用于广域网,而MAC地址用于局域网。但是当前解决的问题只是把数据传输到指定的操作系统下,但是这并不意味着成功运行我们想要实现的目的了。我们还想要让程序执行我们想要的。

2.为了解决表示当前操作系统下进程的唯一性,端口号port的引入就是为了保证客户端的唯一性

3.IP+port保证全网的唯一的进程

4.网络通信的本质:进程间通信。公共资源就是网络,通信就是进程的在IO操作

5.pid也可以表示进程的唯一性,但是之所以使用port是为了协议与系统解耦,使得port可以单独设计。

6.操作系统通过映射关系由port找到对应的进程

7.一个端口号只能绑定一个进程,一个进程可以绑定多个端口号

2.TCP与UDP协议

1.TCP协议介绍

1.TCP协议

Transmission Control Protocol 传输控制协议

1.传输层协议
2.有连接:连接两个进程,再传输
3.可靠传输
4.面向字节流

2.UDP协议

User Datagram Protocol 用户数据报协议

1.传输层协议
2.无连接:直接传数据
3.不可靠传输
4.面向数据报

3.理解

特别的:不可靠和可靠其实是一种中性词,它用于不同的场景。可靠是有成本的,写出的协议一定是比较复杂的,并且维护的成本高;不可靠没有成本,比较简单就可以设计和使用了。

2.网络字节序

1.数据在内存中存储,但是不同的主机大小端不同,所以会出现不同主机的大小端不同。那么如果不做任何改变,网络传输时,数据给到另一台大小端不同时,会出现数据的问题。

2.现在的问题是,不知道接收到的数据是大端还是小端,发送也不知道对方认识大端还是小端

3.因此,规定在网络中传输的数据一定是大端。

发送逻辑

1.发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
2.接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;

3.因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址;

4.TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节

5.不管这台主机是大端还是小端, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
6.如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可

7.系统有专门的接口对数据进行大小端转换:

主机转网络htonl,htons;

网络转主机ntohl,ntohs;

3.socket

1.介绍

1.socket为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

2.套接字的种类有很多:网络套接字(本地通信使用和主机间使用),原始套接字(绕开上层,直接与物理层等下层协议直接访问),域间套接字(本地通信使用的)

3.设计套接字的一套接口,通过不同参数得到不同的套接字模式解决不同的场景问题

2.sockaddr结构

1.struct sockaddr为最初的结构,它是调用接口的模板结构

2.struct sockaddr_in和struct sockaddr_un为不同格式的套接字

3.struct sockaddr_in和struct sockaddr_un的前位反映了他们对应的结构。那么当我们使用struct sockaddr,只需要读取前16位就知道我们使用的结构体是哪一个了

4.UDP协议编程

1.接口介绍

1.创建套接字

 domain:选择本地通信还是网络通信(AF_INET)

type:选择什么类型的服务提供给网络通信

protocol:未来选择什么协议

调用成功,传出一个fd文件描述符,指向打开的文件

2.绑定IP和PORT接口

addr:填充协议的数据结构,是具体的协议,加入IP和PORT

addrlen:结构体长度

1.server服务器的struct sockaddr_in的sin_addr.s_addr定义为INADDR_ANY:绑定任意IP

2.client客户端不需要绑定,操作系统自动帮忙绑定。当要进行通信时,操作系统检查到套接字没有绑定,随机形成端口号进行绑定

3.之所以server服务器需要手动绑定是因为port需要指定,不能随意的改变;而client客户端不需要考虑port是多少,只需要port唯一即可。

4.在云服务器中,0~1024的端口号不允许使用。

3.IP介绍

1.127.0.0.1:本地环回,用于本地测试的IP;其作用原理是,数据往下传到网络层就回到应用层,不进入物理层。

2.云服务器的IP是虚拟化的服务器,不能作为公网的IP地址

3.ifconfig可以查询内网IP地址,表示的是局域网的IP

4.实际上,一款网络服务器不建议只绑定一个IP,因为真实情况会通过不同的IP来进行访问;使用绑定任意IP,只要端口对应,无论哪个IP传过来都可以执行服务器

4.网络情况

netstat:查看当前网络情况(sudo查询更详细的情况)

-u:udp, -a:all,-p:进程,-n:描述

5.执行接口

buf:特定的缓冲区

flags:读取的模式

scr_addr:谁发送的消息

发送消息

buf:特定的缓冲区

flags:读取的模式

scr_addr:谁发送的消息

5.UPD的服务器和客户端接口实现

1.服务端

namespace Server
{enum{USAGE_ERR = 1,SOCKET_ERR,BIND_ERR,OPEN_ERR};static const std::string defaultIp = "0.0.0.0";static const int gnum = 1024;typedef std::function<void(int,std::string, uint16_t, std::string)> func_t;class udpServer{public:udpServer(const func_t &cb, const uint16_t port, const std::string ip = defaultIp): _callback(cb), _port(port), _ip(ip), _sockfd(-1){}void initServer(){// 1.创建套接字_sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (_sockfd == -1){std::cerr << "socket error: " << errno << " : " << strerror(errno) << std::endl;exit(SOCKET_ERR);}// 告诉操作系统,当前的IP和PORT是多少,上面的代码只是把数据存在堆栈上// 2.绑定IP接口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 == -1){std::cerr << "bind error: " << errno << " : " << strerror(errno) << std::endl;exit(BIND_ERR);}}void start(){// 服务器的本质其实就是死循环char buffer[gnum];for (;;){struct sockaddr_in peer;socklen_t len = sizeof peer;ssize_t s = recvfrom(_sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&peer, (socklen_t *)&len);// 1.数据是什么2.谁发的if (s > 0){std::string clientip = inet_ntoa(peer.sin_addr);uint16_t clientport = ntohs(peer.sin_port);std::string massage = buffer;std::cout << clientip << "[" << clientport << "]# " << massage << std::endl;_callback(_sockfd, clientip, clientport, massage);}}}~udpServer(){}private:uint16_t _port;std::string _ip; // 实际上,一款网络服务器不建议只绑定一个IPint _sockfd;func_t _callback;};
}

1.成员函数

1.uint16_t _port:服务器指定的端口号
2.std::string _ip:客户端发送给服务器的IP,一般建议设置为0,表示任意IP路径过来的都可以访问
3.int _sockfd:需要生成的服务器端网络套接字
4.func_t _callback:回调函数,用于服务器业务处理的

2.接口

1.initServer()创建套接字,先初始化套接字,生成对应的套接字,随后将当前的IP和port绑定(bind)起来

2.start()死循环的执行服务器的任务,把需要发送给客户端发送的语句接收到,随后把客户端的IP和port记录,最后执行回调函数

3.main函数

// ./udpServer port
int main(int argc, char *argv[])
{if (argc != 2){Usage(argv[0]);exit(USAGE_ERR);}uint16_t port = atoi(argv[1]);signal(2, reload);std::unique_ptr<udpServer> usvt(new udpServer(Message, port));usvt->initServer();usvt->start();return 0;
}

main函数先选定需要执行的回调函数,随后创建套接字,运行服务器即可

popen=pipe+fork+exec --- 先打开管道pipe,做重定向与文件指针关联,文件内部fork进程,执行exec

4.回调函数

// demo1
const std::string dictTxt = "./dict.txt";
unordered_map<string, string> dict;static bool cutString(const string &target, string *s1, string *s2, const string &sep)
{auto pos = target.find(sep);if (pos == string::npos)return false;*s1 = target.substr(0, pos);           //[)*s2 = target.substr(pos + sep.size()); //[)return true;
}static void debugPrint()
{for (auto &e : dict){cout << e.first << " " << e.second << endl;}
}void reload()
{(void)signo;initDict();
}static void initDict()
{ifstream in(dictTxt, std::ios::binary);if (!in.is_open()){cerr << "open file " << dictTxt << " error" << endl;exit(OPEN_ERR);}string line;string key, value;while (getline(in, line)){// cout << line << endl;if (cutString(line, &key, &value, ":")){dict.insert({key, value});}}in.close();cout << "load dict success!" << endl;
}void handlerMessage(int sockfd, std::string clientip, uint16_t clientport, std::string message)
{// 处理业务string response_message;auto iter = dict.find(message);if (iter == dict.end())response_message = "unkonw";elseresponse_message = iter->second;struct sockaddr_in client;bzero(&client, sizeof client);client.sin_family = AF_INET;client.sin_port = htons(clientport);client.sin_addr.s_addr = inet_addr(clientip.c_str());sendto(sockfd, response_message.c_str(), response_message.size(), 0, (struct sockaddr *)&client, sizeof client);
}// demo2
void execMessage(int sockfd, std::string clientip, uint16_t clientport, std::string cmd)
{string response;FILE *fp = popen(cmd.c_str(), "r");if (fp == NULL){response = cmd + " exec failed";}char line[1024];while (fget(line, sizeof line, fp)){response += line;}pclose(fp);struct sockaddr_in client;bzero(&client, sizeof client);client.sin_family = AF_INET;client.sin_port = htons(clientport);client.sin_addr.s_addr = inet_addr(clientip.c_str());sendto(sockfd, response_message.c_str(), response_message.size(), 0, (struct sockaddr *)&client, sizeof client);
}// demo3
class User
{
public:User(const string &ip, const uint16_t &port) : _ip(ip), _port(port){}~User(){}string ip(){ return _ip; }uint16_t port(){ return _port; }
private:string _ip;uint16_t _port;
};class OnlineUser
{
public:OnlineUser() {}~OnlineUser() {}void addUser(const string &ip, const uint16_t &port){string id = ip + "-" + to_string(port);users.insert(make_pair(id, User(ip, port)));}void delUser(const string &ip, const uint16_t &port){string id = ip + "-" + to_string(port);users.erase(id);}bool isOnline(const string &ip, const uint16_t &port){string id = ip + "-" + to_string(port);return users.find(id) == users.end() ? false : true;}void broadcastMessage(int sockfd, const string &ip, const uint16_t &port, const string &message){for (auto &user : users){struct sockaddr_in client;bzero(&client, sizeof(client));client.sin_family = AF_INET;client.sin_port = htons(user.second.port());client.sin_addr.s_addr = inet_addr(user.second.ip().c_str());string s = ip + "-" + to_string(port) + "# ";s += message;sendto(sockfd, s.c_str(), s.size(), 0, (struct sockaddr *)&client, sizeof(client));}}private:unordered_map<string, User> users;
};void routeMessage(int sockfd, string clientip, uint16_t clientport, string message)
{if (message == "online")onlineuser.addUser(clientip, clientport);if (message == "offline")onlineuser.delUser(clientip, clientport);if (onlineuser.isOnline(clientip, clientport)){// 消息的路由onlineuser.broadcastMessage(sockfd, clientip, clientport, message);}else{struct sockaddr_in client;bzero(&client, sizeof(client));client.sin_family = AF_INET;client.sin_port = htons(clientport);client.sin_addr.s_addr = inet_addr(clientip.c_str());string response = "你还没有上线,请先上线,运行: online";sendto(sockfd, response.c_str(), response.size(), 0, (struct sockaddr *)&client, sizeof(client));}
}

demo的逻辑都是先接收到客户端的信息,通过回调函数执行对应的任务,最后把结果发送给客户端。

此外,将服务端的类和回调函数分离,这样使得耦合度变低,只在main函数修改每一次的指令即可更换命任务。

2.客户端

namespace Client
{class udpClient{public:udpClient(const std::string serverip, const uint16_t serverport): _sockfd(-1), _serverport(serverport), _serverip(serverip), _quit(false){}void initClient(){// 1.创建套接字_sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (_sockfd == -1){std::cerr << "socket error: " << errno << " : " << strerror(errno) << std::endl;exit(2);}std::cout << "socket success: " << _sockfd << std::endl;// 2.绑定IP接口,Client不需要程序员显示的bind,由操作系统进行绑定}void run(){struct sockaddr_in server;memset(&server, 0, sizeof server);server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(_serverip.c_str());server.sin_port = htons(_serverport);std::string massage;while (!_quit){std::cout << "Please Enter# ";std::cin >> massage;sendto(_sockfd, massage.c_str(), massage.size(), 0, (struct sockaddr *)&server, sizeof server);char buffer[1024];struct sockaddr_in temp;socklen_t temp_len = sizeof temp;ssize_t n = recvfrom(_sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&temp, &temp_len);if (n > 0)buffer[n] = 0;std::cout << "服务器的翻译结果:" << buffer << std::endl;}}//demo3的设计// static void *readMessage(void *args)// {//     int sockfd = *(static_cast<int *>(args));//     pthread_detach(pthread_self());//     while (true)//     {//         char buffer[1024];//         struct sockaddr_in temp;//         socklen_t temp_len = sizeof(temp);//         size_t n = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&temp, &temp_len);//         if (n >= 0)//             buffer[n] = 0;//         cout << buffer << endl;//     }//     return nullptr;// }// void run()// {//     pthread_create(&_reader, nullptr, readMessage, (void *)&_sockfd);//     struct sockaddr_in server;//     memset(&server, 0, sizeof(server));//     server.sin_family = AF_INET;//     server.sin_addr.s_addr = inet_addr(_serverip.c_str());//     server.sin_port = htons(_serverport);//     string message;//     char cmdline[1024];//     while (!_quit)//     {//         // cerr << "# "; // ls -a -l//         //  cin >> message;//         fprintf(stderr, "Enter# ");//         fflush(stderr);//         fgets(cmdline, sizeof(cmdline), stdin);//         cmdline[strlen(cmdline) - 1] = 0; // 回车置为/0//         message = cmdline;//         sendto(_sockfd, message.c_str(), message.size(), 0, (struct sockaddr *)&server, sizeof(server));//     }// }~udpClient(){}private:int _sockfd;std::string _serverip;uint16_t _serverport;bool _quit;};
}

1.成员函数

int _sockfd:客户端的套接字

std::string _serverip:服务器的IP地址

uint16_t _serverport:服务器的端口号

bool _quit:执行条件逻辑判断变量

2.接口

1.initClient()初始化客户端的套接字,再绑定套接字

2.run(),客户端先准备好数据,发送给服务端,随着服务端的任务处理,把最终服务端的套接字发送给运行的客户端,得到自己的需求

3.main函数

static void Usage(string proc)
{cout << "Usage:\n\t" << proc << " server_ip server_port\n\n";
}// ./udpClient server_ip server_port
int main(int argc, char *argv[])
{if (argc != 3){Usage(argv[0]);exit(1);}uint16_t serverport = atoi(argv[2]);std::string serverip = argv[1];std::unique_ptr<udpClient> ucli(new udpClient(serverip, serverport));ucli->initClient();ucli->run();return 0;
}

main函数初始化套接字,随后运行即可。

相关文章:

计算机网络(2) --- 网络套接字UDP

计算机网络&#xff08;1&#xff09; --- 网络介绍_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131967378?spm1001.2014.3001.5501 目录 1.端口号 2.TCP与UDP协议 1.TCP协议介绍 1.TCP协议 2.UDP协议 3.理解 2.网络字节序 发送逻辑…...

Idea 结合docker-compose 发布项目

Idea 结合docker-compose 发布项目 这里写目录标题 Idea 结合docker-compose 发布项目Docker 开启远程访问功能 添加相应端口配置IDEA 链接Docker配置项目 docker-compose.yml本地还需要安装 dockerwin11 安装本地Docker 可能存在问题 Linux内核不是最新 Docker 开启远程访问功…...

django

django学习 初识Django1.安装django2.创建项目2.1 在终端2.2 Pycharm 3. 创建app4.快速上手4.1 再写一个页面4.2 templates模板4.3 静态文件4.3.1 static目录4.3.2 引用静态文件 5.模板语法案例&#xff1a;伪联通新闻中心6.请求和响应案例&#xff1a;用户登录7.数据库操作7.1…...

c++游戏框架

游戏类 class Sprite { public:Sprite(int x, int y, int w, int h, const char* imagePath);~Sprite();void render(SDL_Renderer* renderer);void move(int x, int y); private:SDL_Texture* texture_;SDL_Rect rect_; }; 物理引擎类 class PhysicsEngine { public:Physi…...

v-model绑定checkbox无法动态更新视图

在vue2中使用v-model绑定checkbox <input type"checkbox" v-model"isChecked" :valueisChecked change"handleCheckboxChange" />监听change事件&#xff0c;并在change事件中做一些特殊处理&#xff0c;比如用户在登录时有没有阅读过隐私…...

原生html—摆脱ps、excel 在线绘制财务表格加水印(html绘制表格js加水印)

文章目录 ⭐前言⭐html标签&#x1f496;table表格的属性&#x1f496;实现财务报表 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享原生html——绘制表格报表加水印。 背景&#xff1a;解决没有ps的情况下使用前端html制作表格报表。 html介绍 HTML&#xf…...

微信小程序配置上传多个u-upload上传

微信小程序配置上传多个u-upload上传 使用的是uView框架 微信小程序配置上传多个u-upload上传图片 场景需求&#xff1a;根据PC端配置项追加图片配置 小程序根据配置的图片数量&#xff0c;图片名称&#xff0c;进行上传图片 难度在于 我们不知道用户会追加多少个图片配置字段 …...

python使用win32com库实现对Excel的操作

使用win32com库实现对Excel的操作 1. 引言 在日常工作中&#xff0c;我们经常需要对Excel文件进行操作&#xff0c;例如读取和写入数据、格式化和样式、插入和删除等。而使用Python的win32com库&#xff0c;我们可以通过代码来实现对Excel的自动化操作&#xff0c;提高工作效…...

<Maven>项目依赖导入Maven本地仓库命令

项目工程pom.xml文件打开&#xff1a;查看报错的依赖, 将jar包放在D盘(或者其它路径都可)根目录下,在windows黑窗口执行以下命令; 举例&#xff1a;jar包名称&#xff1a; 1.api-1.0-SNAPSHOT102.jar 2.coms-cache-1.0-SNAPSHOT.jar 命令&#xff1a; mvn install:install-fi…...

爬虫006_python中的运算符_算术运算符_赋值运算符_复合赋值运算符_比较运算符_逻辑运算符_逻辑运算符性能提升---python工作笔记024

首先看加减乘除 然后看这里的 // 是取整数部分,不是四舍五入 然后%这个是取余数 然后**是,几次方那种 指数...

CPU Architecture Methodologies

MMU MMU(Memory Management Unit) 负责将逻辑地址转化为物理地址对于现代处理器来说&#xff0c;一般每个core都有自己的 MMU页表等数据结构保存在 TLB NUMA Non-uniform memory access (NUMA) is a computer memory design used in multiprocessing, where the memory access…...

Spring的@Scheduled

Spring的Scheduled的默认线程池数量为1&#xff0c;也就是说定时任务是单线程执行的。这意味着最多同时只有一个任务在执行。当一个任务还在执行时&#xff0c;其他任务会等待其完成&#xff0c;然后按照其预定的执行策略依次执行。 测试代码&#xff1a; 启动类上加注解Enab…...

IP隧道技术原理

简介 IP隧道技术是一种将一个协议的数据包封装在另一个协议的数据包中进行传输的技术。在网络通信中&#xff0c;不同的网络协议之间可能存在不兼容的情况&#xff0c;这时候就需要使用IP隧道技术来解决这个问题。 原理 IP隧道技术的原理是将一个协议的数据包封装在另一个协议…...

Docker私有仓库

Docker私有仓库 Docker官方的Docker hub&#xff08;https://hub.docker.com&#xff09;是一个用于管理公共镜像的仓库&#xff0c;我们可以从上面拉取镜像到本地&#xff0c;也可以把我们自己的镜像推送上去。但是&#xff0c;有时候我们的服务器无法访问互联网&#xff0c;…...

LLM微调 | Prefix-Tuning, Prompt-Tuning, P-tuning, P-tuning-v2

🔥 下面我只是分析讲解下这些方法的原理以及具体代码是怎么实现的,不对效果进行评价,毕竟不同任务不同数据集效果差别还是挺大的。 文章目录 0、hard prompt & soft prompt区别1、Prefix-Tuning2、Prompt-Tuning3、P-tuning4、P-tuning-v25、来看看adapter,lora,pref…...

Ansible 的脚本 --- playbook 剧本

目录 playbook 剧本 playbooks 本身由以下各部分组成 定义、引用变量 指定远程主机sudo切换用户 when条件判断 迭代 Templates 模块 1.先准备一个以 .j2 为后缀的 template 模板文件&#xff0c;设置引用的变量 2.修改主机清单文件&#xff0c;使用主机变量定义一个变…...

CSP-J模拟赛 / 买文具

限制条件 时间限制: 1000 ms, 空间限制: 256 MB 输入文件: pen.in, 输出文件&#xff1a;pen.out 题目描述 开学啦&#xff0c;为了准备新学期的课程学习&#xff0c;小贝到商店买文具。小贝买完文具回家&#xff0c;告诉妈妈说她买了钢笔、圆珠笔和铅笔总共x支&#xff0c…...

leecode算法--每日一题1

二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 前提条件必须满足&#xff1a; 目标数组必须是有序数组 所以…...

LViT:语言与视觉Transformer在医学图像分割

论文链接&#xff1a;https://arxiv.org/abs/2206.14718 代码链接&#xff1a;GitHub - HUANGLIZI/LViT: This repo is the official implementation of "LViT: Language meets Vision Transformer in Medical Image Segmentation" (IEEE Transactions on Medical I…...

蓝桥杯上岸每日N题 第五期(山)!!!

蓝桥杯上岸每日N题第五期 ❗️ ❗️ ❗️ 同步收录 &#x1f447; 蓝桥杯Java 省赛B组(初赛)填空题 大家好 我是寸铁&#x1f4aa; 冲刺蓝桥杯省一模板大全来啦 &#x1f525; 蓝桥杯4月8号就要开始了 &#x1f64f; 距离蓝桥杯省赛倒数第3天 ❗️ ❗️ ❗️ 还没背熟模…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...