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

Cpp网络编程Winsock API

Cpp网络编程Winsock API

作者:blue

时间:2025.3.31

文章目录

  • Cpp网络编程Winsock API
    • **1.服务端**(Server)
      • 1.1初始化网络库
      • 1.2创建套接字对象
      • 1.3设置ip和端口
      • 1.4将套接字对象与ip和端口绑定
      • 1.5设置套接字为监听状态
      • 1.6等待客户端连接
      • 1.7收发数据
      • 1.8关闭连接
    • **2.客户端**(Client)
      • 2.1初始化网络库
      • 2.2创建套接字对象
      • 2.3设置要连接的服务端的IP地址和端口号
      • 2.4连接服务端
      • 参数解释
      • 返回值
      • 2.5收发数据
      • 2.6关闭连接

本文是使用Winsock API进行网络编程的具体实例,最终完成一个C/S架构的TCP通信小demo。文章是对笔者自己学习过程的一个复盘。笔者是从大佬写的这篇文章中学习网络编程的Windows上的C++网络编程保姆级教学-CSDN博客

Q:如何使用Winsock API?

A:答案显而易见,导包,但这里的导包和我们平常直接 #include 还要多加一步。为什么呢?

因为在使用 Windows Sockets API 进行网络编程时,需要使用 ws2_32.lib 库,Windows Sockets API 中的函数(如 socketbindconnectsendrecv 等)的实现都包含在 ws2_32.lib 库中。

#pragma comment(lib, "ws2_32.lib") 是一个预处理器指令,用于在编译时指定链接器需要链接的库文件。

为什么导入 iostream 这种库时不需要类似语句

因为C++ 标准库(如 iostreamvectorstring 等)通常是由编译器自动链接的。编译器在安装时会配置好标准库的路径和链接选项,当你使用标准库中的功能时,编译器会自动处理链接过程,无需手动指定链接库文件。

#include <winSock2.h>
#pragma comment(lib,"WS2_32")

有了Windows Sockets API 我们就可以来编写服务端与客户端程序了。

1.服务端(Server)

1.1初始化网络库

Q:为什么要初始化网络库?

A:因为Windows Sockets 网络功能是通过动态链接库(DLL)来实现的,WSAStartup 函数会对 Windows Sockets 库进行初始化操作,设置内部数据结构、分配必要的资源等。只有完成这些初始化步骤,后续的网络操作函数(如 socketbindconnect 等)才能正常工作。

  • WSADATA wsaData;这行代码的作用是定义一个WSADATA类型的变量wsaDataWSADATA是一个结构体,在 Windows 套接字编程里,该结构体用于存储 Windows 套接字实现的相关信息,像版本号、描述信息等。
  • MAKEWORD(2,2)是一个宏,它的作用是创建一个 16 位的字,这个字的低字节代表主版本号,高字节代表副版本号。这里MAKEWORD(2,2)表示请求使用的 Windows 套接字版本是 2.2。
  • WSAStartup函数会把 Windows 套接字实现的信息填充到wsaData这个结构体里
//1.初始化网络库
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) {//等于0代表初始化成功std::cerr << "初始化网络库失败" << std::endl;return 1;
}

1.2创建套接字对象

//socket(协议族,套接字类型,协议)
协议族:AF_INET:代表 IPv4 协议族,AF_INET6:表示 IPv6 协议族套接字类型:SOCK_STREAM:代表面向连接的流式套接字,基于 TCPSOCK_DGRAM:表示无连接的数据报套接字,基于 UDP协议:通常情况下,如果 type 参数已经明确指定了套接字类型,protocol 可以设置为 0,让系统自动选择合适的协议。
//2.创建套接字对象
SOCKET listenSocket = socket(AF_INET, SOCK_STREAM,0);
//检测是不是有效SOCKET对象
if (listenSocket == INVALID_SOCKET) {std::cerr << "SOCKET对象创建失败" << std::endl;WSACleanup();return 1;
}

1.3设置ip和端口

sockaddr和sockaddr_in(Socket Address Internet)。

用于存储网络地址信息,包括协议族类型、IP地址和端口号,其实就是两个结构体用来设置服务端和客户端的IP地址和端口号的,我们最常使用的是sockaddr_in,操作系统内部使用的则是sockaddr。

引用:原文链接:https://blog.csdn.net/weixin_74027669/article/details/138437305

//3.设置ip和端口
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;//设置协议簇
serverAddr.sin_port = htons(10086);//端口号
//serverAddr.sin_addr.s_addr = INADDR_ANY;
if (inet_pton(AF_INET, "127.0.0.1", &(serverAddr.sin_addr)) <= 0) {std::cerr << "无效地址" << std::endl;closesocket(listenSocket);WSACleanup();return 1;
}

serverAddr.sin_addr.s_addr = INADDR_ANY;

  • 功能INADDR_ANY 是一个预定义的常量,其值通常表示为 0.0.0.0。当你将 serverAddr.sin_addr.s_addr 设置为 INADDR_ANY 时,意味着服务器套接字会监听服务器上所有可用的网络接口。无论服务器有多少块网卡,每个网卡对应不同的 IP 地址,使用 INADDR_ANY 能让服务端程序接受来自任意网络接口的客户端连接请求。

inet_pton(AF_INET, "127.0.0.1", &(serverAddr.sin_addr))

  • 功能inet_pton 函数的作用是将点分十进制的 IP 地址字符串(如 "127.0.0.1")转换为适合存储在 in_addr 结构体中的二进制形式。这里将 "127.0.0.1" 转换后赋值给 serverAddr.sin_addr,意味着服务器套接字只会监听本地回环地址(127.0.0.1)对应的网络接口。本地回环地址通常用于在同一台计算机上进行网络通信测试,程序可以通过该地址与自身进行通信。

1.4将套接字对象与ip和端口绑定

int bind(SOCKET s, const struct sockaddr *name, int namelen);
//bind(套接字描述符,sockaddr结构体指针,结构体大小)
//4.将套接字对象与ip端口进行绑定
if (bind(listenSocket, reinterpret_cast<sockaddr*>(&serverAddr), sizeof(serverAddr)) == SOCKET_ERROR) {std::cerr << "套接字对象与ip端口绑定失败" << std::endl;closesocket(listenSocket);WSACleanup();return 1;
}

reinterpret_cast 是 C++ 中的一种强制类型转换运算符,它用于将一种类型的指针或引用转换为另一种不相关的类型。在这个表达式中:

  • &serverAddr 是获取 serverAddr 变量的地址,serverAddrsockaddr_in 类型的变量,用于存储 IPv4 地址和端口信息。
  • sockaddr* 是目标类型,即 sockaddr 结构体的指针类型。
  • reinterpret_cast<sockaddr*>(&serverAddr) 的作用是将 serverAddr 的地址从 sockaddr_in* 类型强制转换为 sockaddr* 类型。

1.5设置套接字为监听状态

int listen(SOCKET s, int backlog);
//listen(套接字描述符,等待连接的最大数量)
//5.设置套接字为监听状态
if (listen(listenSocket, 5) == SOCKET_ERROR) {std::cerr << "套接字设置监听状态失败" << std::endl;closesocket(listenSocket);WSACleanup();return 1;
}

1.6等待客户端连接

SOCKET accept(SOCKET s, struct sockaddr *addr, int *addrlen);
//accept(套接字描述符,sockaddr结构体指针,结构体大小)

addr

  • 这是一个指向 sockaddr 结构体的指针,用于存储发起连接请求的客户端的地址信息,包括客户端的 IP 地址和端口号。不同的地址族(如 IPv4、IPv6)对应的具体结构体不同,常见的是 sockaddr_in(用于 IPv4)和 sockaddr_in6(用于 IPv6)。当 accept 函数成功接受一个客户端连接时,会将客户端的地址信息填充到这个结构体中。
  • addrnullptr 时,accept 函数不会尝试填充客户端的地址信息,也就不会使用 addrlen 参数。
//6.等待客户端连接
std::cout << "等待客户端连接" << std::endl;
SOCKET clientSocket = accept(listenSocket,nullptr,nullptr);
if (clientSocket == INVALID_SOCKET) {std::cerr << "获取到的客户端SOCKET对象无效" << std::endl;closesocket(listenSocket);WSACleanup();return 1;
}
std::cout << "连接成功" << std::endl;

1.7收发数据

//7.收发数据
while (true) {//接收char recvBuffer[1024]="";if (recv(clientSocket, recvBuffer, sizeof(recvBuffer), 0) == SOCKET_ERROR) {std::cerr << "接收数据失败" << std::endl;closesocket(clientSocket);closesocket(listenSocket);WSACleanup();return 1;}std::cerr << "客户端发来信息:" << recvBuffer << std::endl;//发送std::string message = "hello client";if (send(clientSocket, message.c_str(), message.size(),0) == SOCKET_ERROR) {std::cerr << "向客户端发送信息失败" << std::endl;closesocket(clientSocket);closesocket(listenSocket);WSACleanup();return 1;}
}

recv

int recv(SOCKET s,char   *buf,int    len,int    flags
);
  • s:参数为 clientSocket,它是一个已建立连接的套接字描述符。对于 TCP 连接而言,这个套接字是通过 accept 函数返回的用于和客户端进行通信的新套接字。服务器借助这个套接字接收客户端发送的数据。
  • buf:参数为 recvBuffer,这是一个长度为 1024 的字符数组,用来存储接收到的数据。在调用 recv 函数之前,将其初始化为空字符串 ""
  • len:参数为 sizeof(recvBuffer),也就是 recvBuffer 数组的大小,这里是 1024 字节。这表明 recv 函数最多能接收 1024 字节的数据到 recvBuffer 中。
  • flags:参数为 0,表示采用默认的接收方式。

send

int send(SOCKET s,const char *buf,int len,int flags
);
  • s:参数为 clientSocket,同样是用于和客户端通信的已建立连接的套接字描述符。服务器通过这个套接字向客户端发送数据。
  • buf:参数为 message.c_str()message 是一个 std::string 类型的对象,存储着要发送的消息 "hello client"c_str() 方法会返回一个指向以空字符结尾的 C 风格字符串的指针,该指针指向存储消息内容的内存地址。
  • len:参数为 message.size(),表示要发送的消息的长度,也就是 "hello client" 这个字符串的长度。
  • flags:参数为 0,表示采用默认的发送方式。

1.8关闭连接

WSACleanup()会释放Winsock库所占用的资源,并通知系统不再需要Winsock动态连接库函数。

//8.关闭连接
closesocket(clientSocket);
closesocket(listenSocket);
WSACleanup();

2.客户端(Client)

2.1初始化网络库

//1.初始化网络库
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cerr << "初始化网络库失败" << std::endl;return 1;
}

2.2创建套接字对象

//2.创建SOCKET对象
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);;
//检测是不是有效SOCKET对象
if (clientSocket == INVALID_SOCKET) {std::cerr << "SOCKET对象创建失败" << std::endl;WSACleanup();return 1;
}

2.3设置要连接的服务端的IP地址和端口号

注意是服务器的

//3.设置要连接的服务端的IP地址和端口号
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(10086);
if (inet_pton(AF_INET, "127.0.0.1", &(serverAddr.sin_addr)) <= 0) {std::cerr << "无效地址" << std::endl;closesocket(clientSocket);WSACleanup();return 1;
}

2.4连接服务端

//4.连接服务端
if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {std::cerr << "连接服务器失败" << std::endl;closesocket(clientSocket);WSACleanup();return 1;
}
int connect(SOCKET         s,const sockaddr *name,int            namelen
);

参数解释

  • s:这是一个客户端套接字描述符,也就是通过 socket 函数创建的套接字。此套接字会被用于与服务器建立连接并进行后续的数据通信。在你给出的代码里,clientSocket 就是这个客户端套接字。
  • name:这是一个指向 sockaddr 结构体的指针,该结构体存储着服务器的地址信息,包含服务器的 IP 地址和端口号。由于 sockaddr 是通用的地址结构体,在实际使用时,通常会使用更具体的地址结构体(如 sockaddr_in 用于 IPv4 地址)来设置地址信息,然后再将其指针强制转换为 sockaddr* 类型。在你的代码中,(sockaddr*)&serverAddr 就是将 serverAddr(通常是 sockaddr_in 类型)的地址强制转换为 sockaddr* 类型,serverAddr 里存储着服务器的地址和端口信息。
  • namelen:这是 name 所指向的 sockaddr 结构体的长度,通常使用 sizeof(serverAddr) 来获取。这个参数告知 connect 函数地址结构体的大小。

返回值

  • connect 函数调用成功,会返回 0,表示客户端已成功与服务器建立连接。
  • 若调用失败,会返回 SOCKET_ERROR

2.5收发数据

//5.收发数据
while(true) {std::string message;std::cout << "输入你想发送的信息(输入quit退出):";std::getline(std::cin, message);if (message == "quit") break;if (send(clientSocket, message.c_str(), message.size(), 0) == SOCKET_ERROR) {std::cerr << "向服务端发送信息失败" << std::endl;closesocket(clientSocket);WSACleanup();return 1;}char recvBuffer[1024]="";if (recv(clientSocket, recvBuffer, sizeof(recvBuffer), 0) == SOCKET_ERROR) {std::cerr << "接收数据失败" << std::endl;closesocket(clientSocket);WSACleanup();return 1;}std::cout << "服务端发来消息:" << recvBuffer << std::endl;
}

2.6关闭连接

//6.关闭连接
closesocket(clientSocket);
WSACleanup();
return 0;

相关文章:

Cpp网络编程Winsock API

Cpp网络编程Winsock API 作者&#xff1a;blue 时间&#xff1a;2025.3.31 文章目录 Cpp网络编程Winsock API**1.服务端**&#xff08;Server&#xff09;1.1初始化网络库1.2创建套接字对象1.3设置ip和端口1.4将套接字对象与ip和端口绑定1.5设置套接字为监听状态1.6等待客户端…...

聊聊Spring AI的Chat Model

序 本文主要研究一下Spring AI的Chat Model Model spring-ai-core/src/main/java/org/springframework/ai/model/Model.java public interface Model<TReq extends ModelRequest<?>, TRes extends ModelResponse<?>> {/*** Executes a method call to …...

VUE3+Mapbox-GL 实现鼠标绘制矩形功能的详细代码和讲解

以下是如何使用 Mapbox GL JS 实现鼠标绘制矩形功能的详细代码和讲解。Mapbox GL JS 是一个强大的 JavaScript 库&#xff0c;可以用来创建交互式地图。下面将通过监听鼠标事件并动态更新地图图层来实现这一功能。 实现步骤 初始化地图 在 HTML 文件中引入 Mapbox GL JS 库&…...

Python数据类型-list

列表(List)是Python中最常用的数据类型之一&#xff0c;它是一个有序、可变的元素集合。 1. 列表基础 创建列表 empty_list [] # 空列表 numbers [1, 2, 3, 4, 5] # 数字列表 fruits [apple, banana, orange] # 字符串列表 mixed [1, hello, 3.14, True] # 混合类型…...

【Python】Browser-Use:让 AI 替你掌控浏览器,开启智能自动化新时代!

Browser-Use&#xff1a;让 AI 替你掌控浏览器&#xff0c;开启智能自动化新时代&#xff01; Github地址: https://github.com/browser-use/browser-use/tree/main 在 AI 浪潮席卷的今天&#xff0c;我们是否想过让 AI 不仅仅是聊天、生成内容&#xff0c;而是能像人一样实际操…...

Proxmox配置显卡直通

1.查看显卡 lspci | grep VGA 2.修改grub 2.1备份grub cp /etc/default/grub /etc/default/grub.bak 2.2修改grub vi /etc/default/grub 如果是Intel的CPU GRUB_CMDLINE_LINUX_DEFAULT“quiet intel_iommuon” 如果是AMD的CPU&#xff1a; GRUB_CMDLINE_LINUX_DEFAUL…...

C# FileStream 使用详解

总目录 前言 在 C# 编程中&#xff0c;文件操作是常见的任务之一。FileStream 类是 System.IO 命名空间中的一个重要类&#xff0c;它提供了对文件的读取和写入操作的底层支持。本文将详细介绍 FileStream 的使用方法&#xff0c;包括如何创建、读取、写入文件&#xff0c;以及…...

C++编程语言:抽象机制:一个矩阵的设计(Bjarne Stroustrup)

第29章 一个矩阵的设计(A Matrix Design) 目录 29.1 引言 29.1.1 基本的 Matrix 用法 29.1.2 Matrix 的要求 29.2 一个 Matrix 模板 29.2.1 构造和赋值(Construction and Assignment) 29.2.2 下标和分片(Subscripting and Slicing) 29.3 Matrix算术运算(Matrix…...

Swift LeetCode 246 题解:中心对称数(Strobogrammatic Number)

摘要 在日常开发中&#xff0c;我们经常遇到一些关于对称性的判断&#xff0c;比如字符串回文、镜像翻转等。而 “中心对称数”&#xff08;Strobogrammatic Number&#xff09; 这个问题&#xff0c;本质上是考察一个数字在旋转 180 度后是否还是原来的样子。 这个问题看似简…...

网络安全等级保护测评

名词解释 网络安全等级保护测评 网络安全等级保护测评,是对信息系统进行的一种安全评估活动。它的目的是验证信息系统是否达到了国家网络安全等级保护制度所规定的安全保护要求。这个制度将信息系统按照重要性划分为不同的安全保护等级,每个等级都有相应的安全保护要求。 …...

项目复盘:websocket不受跨域限制的原理

主要还是因为&#xff1a; 1、WebSocket 是独立于 HTTP 的应用层协议&#xff0c;通过 HTTP 建立连接后&#xff0c;完全脱离 HTTP 语义约束。这意味着 不受 HTTP 同源策略限制 不需要预检请求 不依赖 CORS 头机制 2、建立连接时的握手请求仍使用 HTTP 格式&#xff0c;但…...

deep-sync开源程序插件导出您的 DeepSeek 与 public 聊天

一、软件介绍 文末提供下载 deep-sync开源程序插件导出您的 DeepSeek 与 public 聊天&#xff0c;这是一个浏览器扩展&#xff0c;它允许用户公开、私下分享他们的聊天对话&#xff0c;并使用密码或过期链接来增强 Deepseek Web UI。该扩展程序在 Deepseek 界面中添加了一个 “…...

AI原生应用爆发:从通用大模型到垂直场景的算力重构

2025年第一季度&#xff0c;中国AI产业迎来标志性转折点&#xff1a;DeepSeek-R1大模型月活用户突破3000万&#xff0c;通义千问QwQ-32B在医疗领域诊断准确率达三甲医院主治医师水平&#xff0c;京东AI虚拟模特单日生成商品图超200万张……这些数据的背后&#xff0c;是AI技术从…...

arcgis jsapi 4.31 调用geoserver 发布的wms服务

服务的调用我也测试了网络搜索的很多方法&#xff0c;均未奏效&#xff0c;后来还是通过对官网例子的研究&#xff0c;找到了解决方案&#xff0c;调试的过程是非常痛苦的&#xff0c;最大的问题就是调用后没有任何反应&#xff0c;也不会给你任何的错误信息&#xff0c;这是最…...

《筋斗云的K8s容器化迁移》

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 文章目录 **第一章&#xff1a;斗战胜佛的延迟焦虑****第二章&#xff1a;微服务化的紧箍咒****第三章&#xff1a;混沌中的流量劫持****第四章&#xff1a;量子筋斗的终极形态****终章&…...

[笔记.AI]大模型训练 与 向量值 的关系

&#xff08;借助 DeepSeek-V3 辅助生成&#xff09; 大模型在训练后是否会改变向量化的值&#xff0c;取决于模型的训练阶段和使用方式。以下是详细分析&#xff1a; 1. 预训练阶段&#xff1a;向量化值必然改变 动态调整过程&#xff1a; 在预训练阶段&#xff08;如BERT、…...

【学Rust写CAD】18 定点数2D仿射变换矩阵结构体(MatrixFixedPoint结构别名)

源码 // matrix/fixed.rs use crate::fixed::Fixed; use super::generic::Matrix;/// 定点数矩阵类型别名 pub type MatrixFixedPoint Matrix<Fixed, Fixed, Fixed, Fixed, Fixed, Fixed>;代码解析 这段代码定义了一个定点数矩阵的类型别名 MatrixFixedPoint&#xff…...

Linux进程间通信:【目的】【管道】【匿名管道】【命名管道】【System V 共享内存】

目录 一.进程间通信目的 二.管道 三.匿名管道 3.1用fork来共享管理管道 3.2站在文件描述符角度-深度理解管道 3.3内核角度 3.4管道样例 3.4.1测试管道读写 3.4.2代码 解决方案1&#xff1a;倒着关闭&#xff1a; 解决方案2&#xff1a; 只让父进程一个人指向写端 四…...

Python 自动化:节省时间,更智能地工作

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 时间是你最宝贵的资产。如果你花费数小时手动执行重复性任务&#xff0c;那么当 Python 可以为你完成这些任务时&#xff0c;你就是在浪费时…...

StarRocks的执行计划和Profile

文章目录 一、执行计划和Profile相关脚本二、如何分析查询1、概念了解2、Query Plan①查看 Query Plan②分析 Query Plan 3、Query hint4、Query Profile①启用 Query Profile②查看 Query Profile③分析 Query Profile 一、执行计划和Profile相关脚本 命令功能ANALYZE PROFIL…...

【设计模式】过滤器模式

过滤器顾名思义&#xff0c;定义一些过滤规则&#xff0c;将符合要求的内容筛选&#xff0c;就比如过滤不同大小或者不同颜色的水果&#xff0c;需要颜色和大小过滤器&#xff0c;筛选条件独立为对象&#xff0c;可以通过灵活组合形成过滤链条。避免大量使用判断语句。 案例代…...

Jenkins插件安装失败如何解决

问题&#xff1a;安装Jenkins时候出现插件无法安装的情况。 测试环境&#xff1a; 操作系统&#xff1a;Windows11 Jenkins&#xff1a;2.479.3 JDK&#xff1a;17.0.14&#xff08;21也可以&#xff09; 解决办法一&#xff1a; 更换当前网络&#xff0c;局域网、移动、联通…...

GO语言杂记(文章持续更新)

1、MAIN冲突 在一个文件夹下有两个go文件同时写了main函数&#xff0c;将会报错&#xff0c;main函数只能在main包中。 实则不然&#xff0c;有些环境下并不会报错。 2、gofmt命令---自动对齐 命令作用&#xff1a;将go文件代码自动缩进。 gofmt -w escapecharprac.go...

VUE如何前端控制及动态路由详细讲解

在Vue.js中&#xff0c;前端控制通常指的是通过Vue的响应式系统、组件化、路由、状态管理等技术来实现对前端应用的控制和管理 一、前端路由控制基础 使用 vue-router 管理路由&#xff0c;通过路由守卫和动态添加路由实现权限控制。 1. 安装和配置 npm install vue-router…...

【区块链安全 | 第九篇】基于Heimdall设计的智能合约反编译项目

文章目录 背景目的安装1、安装 Rust2、克隆 heimdall-dec3、编译 heimdall-dec4、运行 heimdall-dec 使用说明1、访问 Web 界面2、输入合约信息3、查看反编译结果 实战演示1、解析普通合约2、解析代理合约 背景 在区块链安全研究中&#xff0c;智能合约的审计和分析至关重要。…...

day1_Flink基础

文章目录 Flink基础今日课程内容目标为什么要学Flink技术更新迭代市场需求 流式计算批量计算概念特点 批量计算的优势和弊端流式计算生活中流场景流式计算的概念 Flink简介Flink历史Flink介绍 Flink架构体系已学过的框架技术Flink架构 Flink集群搭建Flink的集群模式Standalone模…...

43页可编辑PPT | 大数据管理中心设计规划方案大数据中心组织架构大数据组织管理

这份文档是一份关于大数据管理中心规划设计方案的详细报告&#xff0c;涵盖了背景与需求分析、整体规划方案、关键能力实现方案以及实施方案等内容。报告强调大数据在城市治理中的重要性&#xff0c;提出通过构建统一的大数据平台&#xff0c;整合城市各部门数据资源&#xff0…...

JavaScript数据结构

目录 JavaScript数据结构 一、基础数据结构 1. 数组&#xff08;Array&#xff09; 2. 对象&#xff08;Object&#xff09; 二、ES6 高级数据结构 1. Map 2. Set 3. WeakMap 与 WeakSet 三、类型化数组&#xff08;Typed Arrays&#xff09; 四、其他数据结构实现 …...

如何使用 FastAPI 构建 MCP 服务器

哎呀&#xff0c;各位算法界的小伙伴们&#xff01;今天咱们要聊聊一个超酷的话题——MCP 协议&#xff01;你可能已经听说了&#xff0c;Anthropic 推出了这个新玩意儿&#xff0c;目的是让 AI 代理和你的应用程序之间的对话变得更顺畅、更清晰。不过别担心&#xff0c;为你的…...

Js 主线程和异步队列哪个先执行

JavaScript 主线程与异步队列执行顺序详解 JavaScript 是单线程语言&#xff0c;通过事件循环&#xff08;Event Loop&#xff09;机制来处理同步和异步任务。以下是主线程与异步队列的执行顺序解析&#xff1a; 1. 执行顺序基本原则 console.log(1. 主线程同步任务);setTim…...

C#实现HTTP服务器:处理文件上传---解析MultipartFormDataContent

完整项目托管地址&#xff1a;https://github.com/sometiny/http HTTP还有重要的一块&#xff1a;文件上传。 这篇文章将详细讲解下&#xff0c;前面实现了同一个链接处理多个请求&#xff0c;为了方便&#xff0c;我们独立写了一个HTTP基类&#xff0c;专门处理HTTP请求。 ht…...

【hadoop】远程调试环境

根据上一节&#xff0c;我们已经安装完成hadoop伪分布式环境 hadoop集群环境配置_jdk1.8 441-CSDN博客 还没安装的小伙伴可以看看这个帖子 这一节我们要实现使用vscode进行远程连接&#xff0c;并且完成java配置与测试 目录 vscode 配置远程 安装java插件 新建java项目 …...

检索增强生成(RAG):强化 AI 智能体的知识 “武装”

技术点目录 第一章、智能体(Agent)入门第二章、基于字节Coze 构建智能体(Agent)第三章、基于其他平台构建智能体&#xff08;Agent&#xff09;第四章、国内外智能体(Agent)经典案例详解第五章、大语言模型应用开发框架LangChain入门第六章、基于LangChain的大模型API接入第七章…...

使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例

1. 使用 Provider 实现局部刷新 示例 1&#xff1a;ChangeNotifier Consumer 通过 ChangeNotifier 和 Consumer 实现局部刷新。 import package:flutter/material.dart; import package:provider/provider.dart;void main() {runApp(ChangeNotifierProvider(create: (_) &g…...

notepad++ 正则表达式

注意&#xff1a;Notepad正则表达式字符串最长不能超过69个字符 \ 转义字符 如&#xff1a;要使用 “\” 本身, 则应该使用“\\” \t Tab制表符 注&#xff1a;扩展和正则表达式都支持 \r 回车符CR 注&#xff1a;扩展支持&#xff0c;正则表达式不支持 \n 换行符…...

一起学大语言模型-通过ollama搭建本地大语言模型服务

文章目录 Ollama的github地址链接安装下载需求配置更改安装目录安装更改下载的模型存储位置Ollama一些目录说明日志目录 运行一个模型测试下测试下更改服务监听地址和端口号 Ollama的github地址链接 https://github.com/ollama/ollama 安装 下载 mac安装包下载地址&#xff1…...

webpack配置详解+项目实战

webpack在vue中的配置&#xff0c;适合想重新认知webpack的你 webpack配置-初级配置 1、配置入口和出口文件 2、配置loader 3、配置eslint&#xff08;可组装js、jsx检查工具&#xff09; 4、配置babel&#xff08;将高级的js语法转换成低版本的js语法&#xff09; 5、使用 ht…...

【学习笔记】文件上传漏洞--js验证、mime验证、.user.ini、短标签、过滤、文件头

概念 文件上传漏洞 什么是文件上传漏洞&#xff1f; 文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷&#xff0c;而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。 这里上传的文件可以是木马&#xff0c;病毒&#xff0c;恶意脚…...

经典卷积神经网络LeNet实现(pytorch版)

LeNet卷积神经网络 一、理论部分1.1 核心理论1.2 LeNet-5 网络结构1.3 关键细节1.4 后期改进1.6 意义与局限性二、代码实现2.1 导包2.1 数据加载和处理2.3 网络构建2.4 训练和测试函数2.4.1 训练函数2.4.2 测试函数2.5 训练和保存模型2.6 模型加载和预测一、理论部分 LeNet是一…...

【VM虚拟机ip问题】

我就是我&#xff0c;不一样的烟火。 文章目录 前言一、启动VM虚拟机1. 开启虚拟机2. 输入账号密码登录3. 依次输入指令 二、主机ping地址测试1. ping ip地址-成功 三、安装-MobaXterm_Personal_21.51. 点击Session2. 选择SSH连接3. 输入信息4. 首次进入5. 连接成功 总结 前言 …...

【计算机视觉】YOLO语义分割

一、语义分割简介 1. 定义 语义分割&#xff08;Semantic Segmentation&#xff09;是计算机视觉中的一项任务&#xff0c;其目标是对图像中的每一个像素赋予一个类别标签。与目标检测只给出目标的边界框不同&#xff0c;语义分割能够在像素级别上区分不同类别&#xff0c;从…...

【C++游戏引擎开发】《线性代数》(3):矩阵乘法的SIMD优化与转置加速

一、矩阵乘法数学原理与性能瓶颈 1.1 数学原理 矩阵乘法定义为:给定两个矩阵 A ( m n ) \mathrm{A}(mn) A(mn)和 B ( n p ) \mathrm{B}(np) B(np),它们的乘积 C = A B \mathrm{C}=AB C=AB 是一个 m p \mathrm{m}p mp 的矩阵,其中: C i , j = ∑ k = 1…...

聚焦交易能力提升!EagleTrader 模拟交易系统打造交易成长新路径

在全球市场波动加剧的背景下&#xff0c;交易者面临的挑战已不仅限于技术分析层面。许多交易者在实盘操作中常因情绪干扰导致决策变形&#xff0c;如何构建科学的交易心理与风险控制体系成为行业关注焦点。 国内自营交易考试EagleTrader运用自己研发的模拟交易系统&#xff0c…...

文件分片上传

1前端 <inputtype"file"accept".mp4"ref"videoInput"change"handleVideoChange"style"display: none;">2生成hash // 根据整个文件的文件名和大小组合的字符串生成hash值&#xff0c;大概率确定文件的唯一性fhash(f…...

C#Lambda表达式与委托关系

1. 核心关系图示 A[委托] --> B[提供方法容器] B --> C[Lambda表达式] C --> D[委托实例的语法糖] A --> E[类型安全约束] C --> F[编译器自动生成委托实例] 2. 本质联系 2.1 类型关系 ‌Lambda表达式‌是编译器生成的‌委托实例‌表达式自动匹配符合签名的…...

机器翻译和文本生成评估指标:BLEU 计算公式

&#x1f4cc; BLEU 计算公式 BLEU 主要由**n-gram精确匹配率&#xff08;Precision&#xff09;和长度惩罚&#xff08;Brevity Penalty, BP&#xff09;**组成。 1️⃣ n-gram 精确匹配率 计算不同长度的 n-gram&#xff08;1-gram, 2-gram, ..., n-gram&#xff09;在生成…...

24 python 类

在办公室里&#xff0c;类就像一个部门&#xff08;如销售部、财务部&#xff09;&#xff0c;定义了该部门员工的共同属性&#xff08;姓名、职位&#xff09;和行为&#xff08;处理客户、提交报表&#xff09;。 一、面向对象技术简介 作为一个要入门码农的牛马&#xff0…...

pycharm与python版本

python 3.6-3.9 pycharm 2021版本搭配最好 python 3.8 pycharm 2019版本搭配最好 pycharm各版本下载...

23种设计模式-结构型模式-外观

文章目录 简介问题解决方案示例代码总结 简介 也称&#xff1a;门面模式、Facade。外观是一种结构型设计模式&#xff0c;能为程序库、框架或其他复杂类提供一个简单的接口。 问题 假设你必须在代码中使用某个复杂的库或框架中的众多对象。正常情况下&#xff0c;你需要负责…...

open3d教程 (三)点云的显示

官方文档位置&#xff1a; Visualization - Open3D 0.19.0 documentationhttps://www.open3d.org/docs/release/tutorial/visualization/visualization.html核心方法&#xff1a; o3d.visualization.draw_geometries([几何对象列表]) import open3d as o3dprint("Load …...