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

【第22节】windows网络编程模型(WSAAsyncSelect模型)

目录

引言

一、WSAAsyncSelect模型概述

二、WSAAsyncSelect模型流程

2.1 自定义消息

2.2 创建窗口例程

2.3 初始化套接字

2.4 注册网络事件

2.5 绑定和监听

2.6 消息循环

三、完整示例代码


引言

        在网络编程的广袤天地中,高效处理网络事件是构建稳定应用的关键。WSAAsyncSelect模型作为一种独特且实用的网络编程模型,为开发者提供了异步处理网络事件的有力手段。它巧妙地将Windows窗口消息机制与套接字相结合,让应用程序能够基于消息通知,及时响应各类网络事件。接下来,让我们深入探究WSAAsyncSelect模型的工作原理、具体流程以及在实际编程中的应用,一同解锁其在网络编程领域的强大潜力。

一、WSAAsyncSelect模型概述

        Windows 套接字异步选择模型,要是想在应用程序里用上WSAAsyncSelect模型,第一步就是用CreateWindow函数创建一个窗口,紧接着得给这个窗口配备一个窗口回调函数(WinProc)。除了创建窗口,使用对话框也是可行的,这种情况下就得给对话框配上对话框回调函数。

        WinSock给出了一个特别好用的异步I/O模型。依靠这个模型,应用程序可以在某个套接字上,接收那些基于Windows消息的网络事件通知。

        WSAAsyncSelect模型的实现办法是这样的:调用WSASyncSelect函数,这么做会自动把套接字切换到非阻塞模式,与此同时,还能注册一个或者多个你关心的网络事件。它会把套接字、窗口句柄以及自定义消息捆绑到一块儿。只要之前注册的网络事件发生了,对应的窗口就会收到一个基于消息的通知 。

二、WSAAsyncSelect模型流程

2.1 自定义消息

        用户需要自定义一个消息。当相关网络事件消息出现时,这个自定义消息会被发送到消息队列中。一般有以下两种自定义消息的方式:
1. 静态注册消息:

#define WM_MYSOCKETMSG WM_USER + 100; //具体查看自定义消息的范围

2. 动态注册消息:

#define MYWN_SOCKET L"MYWN_SOCK" //自定义一个字符串
UINT g_nNetMsgID = RegisterWindowMessage(MYWN_SOCKET);

2.2 创建窗口例程

        利用WSAAsyncSelect()函数开发WinSock应用程序,离不开Windows窗口。在窗口实例中接收用户自定义的消息。以Win32应用程序为例:

HWND g_SockHwnd = NULL; //接收SOCKET消息的窗口句柄
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {HWND hWnd;hInst = hInstance; //将实例句柄存储在全局变量中hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);g_SockHwnd = hWnd;if (!hWnd)return FALSE;ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;
}

2.3 初始化套接字

        初始化组件和创建套接字的方法之前已经介绍过。

#include"winsock2.h"
#pragma comment(lib,"WS2_32.lib")
WSADATA stcData;
int nResult = 0;
nResult = WSAStartup(MAKEWORD(2, 2), &stcData);
//2.创建套接字
SOCKET sSocket = socket(AF_INET, SOCK_STREAM, 0);

2.4 注册网络事件

        WSAAsyncSelect函数有两个主要作用,一是它能自动把套接字设置成非阻塞模式,二是会给套接字关联上一个窗口句柄。一旦有网络事件出现,比如连接建立、数据发送或接收等情况发生,WSAAsyncSelect函数就会把相关信息发送到之前绑定的那个窗口。这样,应用程序在接收到像是连接、发送、接收这类网络通知时,对应的具体信息就会被投放到窗口消息队列当中 。

int WSAAsyncSelect(SOCKET s,         //套接字句柄HWND hWnd,        //要响应事件的窗口句柄unsigned int wMsg, //自定义的消息long lEvent       //注册的网络事件
);

         注:其中窗口句柄是在创建主窗口时获得的。注册网络事件通常在创建时设定连接通知和关闭通知。
(1)FD_READ事件触发条件:
    - 在数据到达socket后,并且前一个recv()调用完毕。
    - 调用recv()后,缓冲区还有未读完的数据时,还会继续响应该事件。
(2)FD_WRITE事件触发条件:
    - 第一次connect()或accept()后(即连接建立后)。
    - 调用send()返回WSAEWOULDBLOCK错误后,再次调用send()或sendto函数成功时。
(3)FD_ACCEPT事件触发条件:当有请求建立连接,并且前一个accept()调用后。
(4)FD_CLOSE事件触发条件:自己或客户端中断连接后。
(5)FD_CONNECT事件触发条件:调用了connect(),并且连接建立后。
示例:

WSAAsyncSelect(sSocket,g_SockHwnd,  g_nNetMsgID,    //当前服务端的SOCK句柄//当前服务端的窗口句柄//当有网络事件响应时窗口接收的消息FD_ACCEPT | FD_CLOSE);//需要响应的网络事件消息

2.5 绑定和监听

1. 初始化地址定址:

sockaddr_in sAddr = {0};
sAddr.sin_family = AF_INET;
sAddr.sin_port = htons(1234);
sAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

2. 绑定:

int nRet = 0;
nRet = bind(sSocket,(sockaddr*)&sAddr,sizeof(sockaddr_in));
//接收返回信息
//当前客户端SOCK句柄
//IP定址
//IP定址结构体大小

3. 监听:

nRet = listen(sSocket, SOMAXCONN);
//当前服务端的SOCK句柄
//等待连接的最大队列长度

2.6 消息循环

在消息循环中实现自定义消息的处理过程。

WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

当网络事件消息抵达一个窗口回调函数后:
- `message`为当前自定义消息。
- `wParam`为当前响应网络事件的套接字。
- `lParam`的高16位为错误码,低16位为具体的网络事件。
通过以下宏来获取相关信息:
- `WSAGETSELECTERROR`:返回`lParam`高字位包含的错误信息。
- `WSAGETSELECTEVENT`:根据得到的`lParam`的低字部分确定具体是哪一类网络事件。


示例代码:

int lError = WSAGETSELECTERROR(lParam); //高16位表示错误码
int lEvent = WSAGETSELECTEVENT(lParam);  //低字节为发生的网络事件
SOCKET MsgSocket = (SOCKET)wParam;       //消息事件
switch (lEvent) {
case FD_ACCEPT:sockaddr_in ClientAddr = {};int nClientLength = sizeof(ClientAddr);SOCKET sClientSock = accept(MsgSocket,//客户端地址信息//客户端地址信息长度//当前服务端的SOCK句柄(sockaddr*)&ClientAddr, &nClientLength);//设置消息模式WSAAsyncSelect(sClientSock, g_SockHwnd, g_nNetMsgID,FD_READ | FD_WRITE | FD_CLOSE);
}

接收不到网络事件的原因
        1. 在同一个套接字上,自定义的网络事件窗口消息被多次调用WSAAsyncSelect()函数注册不同的网络事件,这种情况下以最后一次注册的网络事件为准。例如:

WSAAsyncSelect(s, hWnd, wm_msg, FD_READ);
WSAAsyncSelect(s, hWnd, wm_msg, FD_ACCEPT);

        2. 在同一个套接字上多次调用WSAAsyncSelect()函数,且使用了不同的网络事件窗口消息。例如:

WSAAsyncSelect(s, hWnd, wm_msg1, FD_READ);
WSAAsyncSelect(s, hWnd, wm_msg2, FD_READ);

以下是示例代码部分:

#include "WSAAsyncSelect.h"
UINT g_nNetMsgID = 0;
HWND g_SockHwnd = NULL;
SOCKET g_sClientSock = NULL;
//套接字消息
//接收SOCKET消息的窗口句柄
//客户端Socket句柄
#define WM_MYSOCKETMSG WM_USER + 100;
BOOL AsyncSelectTCP() {//1.初始化套接字WSADATA stcData;int nResult = 0;nResult = WSAStartup(MAKEWORD(2, 2), &stcData);if (nResult == SOCKET_ERROR)return FALSE;g_nNetMsgID = RegisterWindowMessage(MYWN_SOCKET);//2.创建套接字SOCKET sSocket = Socket(AF_INET, SOCK_STREAM, 0);//3.注册感兴趣的网络事件//注册消息//当前服务端的SOCK句柄int nRet = WSAAsyncSelect(sSocket, g_SockHwnd,//当前服务端的窗口句柄g_nNetMsgID,//当有网络事件响应时窗口接收的消息FD_ACCEPT | FD_CLOSE);//需要响应的网络事件消息if (nRet) {MessageBox(NULL, L"", L"在监听SOCKET上设置网络消息失败", MB_OK);goto CloseSock;}//4.初始化地址定址sockaddr_in sAddr = {0};sAddr.sin_family = AF_INET;sAddr.sin_port = htons(1234);sAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//5.绑定nRet = bind(sSocket,(sockaddr*)&sAddr,sizeof(sockaddr_in));//当前客户端SOCK句柄//IP定址//IP定址结构体大小if (SOCKET_ERROR == nRet) {MessageBox(NULL, L"", L"绑定到指定地址端口出错!", MB_OK);goto CloseSock;}//6.监听  在调用WSAAsyncSelect后sSocket已经是非阻塞模式nRet = listen(sSocket,            //当前服务端的SOCK句柄SOMAXCONN);          //等待连接的最大队列长度if (SOCKET_ERROR == nRet) {MessageBox(NULL, L"错误", L"SOCKET进入监听模式出错!", MB_OK);goto CloseSock;}return TRUE;
CloseSock:closesocket(sSocket);WSACleanup();return FALSE;
}
//************************************
//函数名称: SocketMsg响应网络事件消息
//返回值:
//参数:
//参数:
//参数:
//参数:
//************************************
void SocketMsg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {int iError = WSAGETSELECTERROR(lParam);int lEvent = WSAGETSELECTEVENT(lParam);SOCKET MsgSocket = (SOCKET)wParam;switch (lEvent) {//高16位表示错误码//低字节为发生的网络事件//响应消息事件的套接字case FD_ACCEPT: {sockaddr_in ClientAddr = {};int nClientLength = sizeof(ClientAddr);//客户端地址信息长度if (!g_sClientSock)   //当前例子只允许连接一个客户端{g_sClientSock = accept(MsgSocket,   //当前服务端的SOCK句柄(sockaddr*)&ClientAddr,&nClientLength);//重新为该消息设置网络事件WSAAsyncSelect(sClientSock, g_SockHwnd, g_nNetMsgID,FD_READ | FD_WRITE | FD_CLOSE);}break;}case FD_CLOSE: {closesocket(g_sClientSock);}break;case FD_READ:char szBufTmp[1024] = {0};if (g_sClientSock) {int iRecv = recv(MsgSocket, szBufTmp, 1024, 0);if (SOCKET_ERROR == iRecv || 0 == iRecv) {if (WSAEWOULDBLOCK == WSAGetLastError())Sleep(20);//停20ms}else {//显示信息}}break;}
}

在`XXX主窗口.cpp`文件中:
        1. 在`InitInstance`函数中创建窗口时,保存该窗口句柄:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {HWND hWnd;hInst = hInstance; //将实例句柄存储在全局变量中hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);g_SockHwnd = hWnd;if (!hWnd) {return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;
}


        2. 在窗口回调函数中判断当前消息是否为自定义消息:

if (g_nNetMsgID == message) {SocketMsg(hWnd, message, wParam, lParam);
}

        WSAAsyncSelect模型通过将套接字与窗口消息机制相结合,为网络编程提供了一种异步处理网络事件的方式,在实际应用中有助于提升程序对网络事件的响应效率和处理能力 。

 

三、完整示例代码

TCP客户端代码:

待补充

- 这是一个基础的TCP客户端实现
- 主要功能:
  - 连接到服务器(127.0.0.1:0x1234)
  - 使用多线程处理接收消息
  - 通过控制台输入发送消息
  - 基本的错误处理 

WSAAsyncSelect模型服务端:

待补充

 这是一个基于Windows消息机制的TCP服务器实现
- 主要特点:
  - 使用WSAAsyncSelect实现异步通信
  - 通过Windows消息机制处理网络事件
  - 支持多客户端连接
  - 使用自定义消息(WM_MYSOCKET)处理网络事件
  - 在界面上显示连接状态和消息

 

 

相关文章:

【第22节】windows网络编程模型(WSAAsyncSelect模型)

目录 引言 一、WSAAsyncSelect模型概述 二、WSAAsyncSelect模型流程 2.1 自定义消息 2.2 创建窗口例程 2.3 初始化套接字 2.4 注册网络事件 2.5 绑定和监听 2.6 消息循环 三、完整示例代码 引言 在网络编程的广袤天地中,高效处理网络事件是构建稳定应用的…...

RTD2525BE《HDMI转EDP,DP转EDP》显示器芯片

一、产品概述 瑞昱RTD2525BE是一款专为高端显示设备设计的多接口转换芯片,支持HDMI 2.0与DisplayPort(DP)1.4双输入,并高效转换为嵌入式DisplayPort(eDP)输出。该芯片集成先进信号处理技术,支持…...

【贝叶斯定理(Bayesian Theorem)】

贝叶斯定理(Bayesian Theorem)是概率论中一个革命性的工具,它将主观信念与客观数据结合,形成了独特的贝叶斯统计体系。以下我们将从数学原理、哲学内涵、实际应用三个维度进行深度解析。 一、贝叶斯定理的数学本质 1. 核心公式的…...

Docker逃逸

判断是否再docker中 1.ls -a / (查看c根目录查看是否有docker配置文件) 2.查看进程 如果在要逃逸到真实环境中: 特权模式进行docker逃逸:管理员执行eddocker run--privileg,如何判断是否是特权模式() 特权模式以…...

kotlin 函数引用

引言 先确认一下,什么叫做引用 Object obj new Object() //这里的obj就是一个强引用 再确认一个结论: lambda 属于函数类型对象 。 fun methodResponseResult(msg: String , respo:(Int, String)->Unit){}fun methodRespoResunt(type: Int ,msg: S…...

Linux | 安装 Samba将ubuntu 的存储空间指定为windows 上的一个磁盘

01 安装 samba 文件来实现。比如把我们 ubuntu 的存储空间指定为我们 windows 上的一个磁盘,然后我们在这个磁盘里面创建 .c 文件,进行我们代码的修改和编写,可以安装 samba 文件来实现。 samba 是一种网络共享服务,可以通过网络访问我们指定的文件夹 02 第一步:下…...

Linux小知识

1. /etc目录 我们在配置文件中一直会调用 /etc目录 cd /etc/xxxx.conf etc的全称是editable configuration(其中一种说法)意为可编辑的配置;此目录主要用来存放系统的配置文件和初始化文件的;像网络配置 用户信息 各种服务的配置…...

冒排排序相关

先说一个阿里云学生无门槛免费领一年2核4g服务器的方法: 阿里云服务器学生无门槛免费领一年2核4g_阿里云学生认证免费服务器-CSDN博客 当谈到排序算法时,冒泡排序(Bubble Sort)是最简单且最基础的排序算法之一。它的原理是依次比…...

SQLMesh SCD-2 时间维度实战:餐饮菜单价格演化追踪

场景背景:动态菜单价格管理 考虑某连锁餐厅的菜单管理系统,需要记录食品价格的历史变更轨迹。业务需求包括: 记录每次价格调整的时间点支持历史价格查询(如"2020年1月2日汉堡多少钱")维护当前有效价格清单…...

深入分析和讲解虚拟化技术原理

随着云计算和大数据技术的飞速发展,虚拟化技术应运而生,成为数据中心和IT基础设施的重要组成部分。本文将深入分析虚拟化的基本原理、主要类型以及在实际应用中的意义。 一、虚拟化技术的定义 虚拟化技术是通过软件将物理硬件资源抽象成虚拟资源的技术&…...

再探C语言(1)

温馨提示: 学C语言就像玩《掘地求升》——你以为懂了语法就能通关? 不!编译器会用铁锤教你做人!(╯‵□′)╯︵┻━┻ 🐱Part 1:sizeofの跨平台迷惑行为 Q1. 不同环境下sizeof(int)的结果 运行环境结果&a…...

#echarts#折线图#饼图

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>折线图</title> </head> <body><div id"app" style"width:100%;height:100%;"><div id"chart-c…...

Three.js世界中的三要素:场景、相机、渲染器

一、Three.js简介 Three.js是一个基于WebGL的JavaScript库&#xff0c;它允许开发者在网页上创建和显示复杂的3D图形和动画&#xff0c;而无需用户安装任何额外的插件或软件。Three.js在Web开发中的地位非常重要&#xff0c;它通过提供简单直观的API&#xff0c;极大地降低了3…...

nginx5天时间从0到熟练掌握学习计划

要在 5 天内熟练地在项目中使用 Nginx&#xff0c;需要制定一个高效的学习计划&#xff0c;重点学习 Nginx 的核心功能和实际应用。以下是一个详细的学习计划&#xff0c;帮助你从零开始掌握 Nginx。 学习目标 掌握 Nginx 的基本概念和安装方法。能够配置 Nginx 托管静态文件、…...

2Dslam前端分类

文章目录 扫描匹配ICP核心思想具体流程&#xff1a; 似然场核心思想&#xff1a;基本原理&#xff1a;具体流程&#xff1a; 扫描匹配 Scan-to-Scan&#xff08;扫描到扫描&#xff09;匹配 扫描到扫描匹配是最基本的扫描匹配方法&#xff0c;通过比较当前扫描数据与上一扫描数…...

SOFABoot-02-模块化隔离方案

sofaboot 前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概览 SOFABoot-01-蚂蚁金…...

Maven环境搭建与配置

1 下载压缩包 官网下载地址: Download Apache Maven – Maven 2 配置系统环境变量 1.x版本配置Maven_HOME2.x版本配置M2_HOME3.x版本配置PATH检查是否配置生效: 打开命令窗口输入:mvn -version 3 配置开发工具IDEA 为什么不使用idea自带的maven插件? ‌版本兼容性问题‌:I…...

设计模式-结构型模式-组合模式

概述 组合模式 : Composite Pattern : 是一种结构型设计模式。 **它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。** 核心思想&#xff1a; 让单个对象 和 组合对象 实现相同的接口&#xff0c;这样就可以在不区分是单个对象还是组合对象的情况下&#xff0c;以相…...

如何使用jenv工具管理多个JDK版本

一、jenv到底是干啥的&#xff1f; 简单来说&#xff0c;jenv就是专门用来管理多个Java版本的工具。不管是开发、测试&#xff0c;还是生产环境&#xff0c;只要你需要在同一台机器上用不同的Java版本&#xff0c;它都能帮上大忙。比如说&#xff0c;项目A要求JDK 8&#xff0…...

macOS 使用 iconv 转化文件编码

文章目录 使用方式支持的编码类型iconv 更多用法 使用方式 iconv -f GB2312 -t UTF-8 分治算法.txt > 分治算法2.txt 支持的编码类型 可以使用 下面命令 查看编码类型 iconv -lPS : ISO-8859 有很多种分支&#xff0c;iconv 支持 ISO-8859-1、ISO-8859-10&#xff0c;但…...

常考计算机操作系统面试习题(二)(上)

目录 1. 描述分段内存管理机制 2. 解释文件分配磁盘块链接分配方法的优点和缺点 3. 进程的状态有哪些&#xff1f; 4. 一个进程的空间包括哪些部分&#xff1f; 5. 进程和程序的区别&#xff1f; 6. CPU调度可能发生在当一个进程&#xff1a; 7. 哪些条件同时出现&#…...

Mac | Excel | 列数改为和行数一样用数字表示

2. 3....

SLAM十四讲【二】三维空间刚体运动

SLAM十四讲【二】三维空间刚体运动 SLAM十四讲【一】基本概念 SLAM十四讲【二】三维空间刚体运动 SLAM十四讲【三】李群与李代数 SLAM十四讲【四】相机与图像 SLAM十四讲【五】线性优化 SLAM十四讲【六】视觉里程计 SLAM十四讲【七】回环检测 SLAM十四讲【八】建图 文章目录 S…...

Java对象的hashcode

在 Java 中&#xff0c;hashcode 和 equals 方法是 Object 类的两个重要方法&#xff0c;它们在处理对象比较和哈希集合&#xff08;如 HashMap、HashSet&#xff09;时起着关键作用。对于equals大部分Java程序员都不陌生&#xff0c;它通常是比较两个对象的内容(值)是否相等(双…...

华为ipd流程华为流程体系管理华为数字化转型流程数字化管理解决方案介绍81页精品PPT

华为流程体系最佳实践主要包括构建完善的流程框架&#xff0c;明确各层级流程要素与职责&#xff0c;梳理涵盖研发、采购、营销、服务、资产管理等多领域的流程&#xff0c;通过梳理业务场景和核心能力搭建差异化流程框架&#xff0c;采用自上而下与自下而上相结合的建模方法&a…...

人工智能 - 通用 AI Agent 之 LangManus、Manus、OpenManus 和 OWL 技术选型

一、核心项目概览 1. Manus(闭源通用 AI Agent) 定位 :全球首个全流程自动化通用 AI Agent,GAIA 基准测试 SOTA 水平。核心能力 : 全流程自动化 :从任务规划(如撰写报告)到执行(代码生成、表格制作)的端到端处理。智能纠错机制 :基于沙箱环境的实时错误反思与调整…...

数据库基础知识

目录 一、什么是数据库&#xff1f; 二、基本使用方法 &#xff08;1&#xff09;启动服务器进程 &#xff08;2&#xff09;连接服务器 &#xff08;3&#xff09;基本sql语句 三、MySQL架构 四、SQL语句分类 五、存储引擎是什么 一、什么是数据库&#xff1f; 数据库…...

嵌入式硬件工程师从小白到入门-原理图(三)

原理图绘制从小白到入门&#xff1a;知识点速通与注意事项 一、原理图绘制基础概念 什么是原理图&#xff1f; 原理图&#xff08;Schematic&#xff09;是电子电路的图形化表示&#xff0c;展示元器件之间的电气连接关系&#xff0c;是硬件设计的蓝图。 核心元素 元器件符号&…...

国科大——英语A——机考测试题

前沿&#xff1a; 此文记录了国科大所提供的一套机考试卷。 PART I VOCABULARY &#xff08;20道&#xff0c;十分&#xff09; Directions&#xff1a;Choose the best word or phrase from the choices A, B, C, or D to complete the following sentences. 1.For most pe…...

2025-03-22 学习记录--C/C++-PTA 习题4-11 兔子繁衍问题

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 习题4-11 兔子繁衍问题 一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每…...

HC-05与HC-06蓝牙配对零基础教程 以及openmv识别及远程传输项目的概述

这个是上一年的项目&#xff0c;之前弄得不怎么完整&#xff0c;只有一个openmv的&#xff0c;所以openmv自己去我主页找&#xff0c;这篇主要讲蓝牙 这个是我在使用openmv连接单片机1然后单片机1与单片机2通过蓝牙进行通信 最终实现的效果是&#xff1a;openmv识别到图形和数…...

Deepseek训练成AI图片生成机器人

目录 内容安全层 语义理解层 提示词工程层 图像生成层 交付系统 训练好的指令(复制就可以) 内容安全层 理论支撑:基于深度语义理解的混合过滤系统 敏感词检测:采用BERT+CRF混合模型,建立三级敏感词库(显性/隐性/文化禁忌),通过注意力机制捕捉上下文关联风险 伦…...

在线问卷调查|在线问卷调查系统|基于Spring Boot的在线问卷调查系统的设计与实现(源码+数据库+文档)

在线问卷调查 目录 基于Spring Boot的在线问卷调查系统 一、前言 二、系统设计 三、系统功能设计 1.1 问卷管理 1.2 问卷调查管理 1.3 题目管理 2.1 问卷列表 2.2 问卷调查 2.3 问卷调查记录 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…...

计算机网络的软件、硬件和组成

&#xff11;.计算机网络的组成 计算机网络是一个十分复杂的系统&#xff0c;在逻辑上可以分为完成数据通信的通信子网和进行数据处理的资源子网两个部分。 通信子网 通信子网提供网络通信的功能&#xff0c;可以完成网络主机之间的数据传输、交换、通信控制和信号变换等通信…...

Cursor的五种高级用法

文章目录 代码编写写作编辑自动生成工作流搞定开源项目数据处理参考 代码编写 Cursor 最基本的功能是帮助你编写代码。只需使用 Composer&#xff08;CtrlI&#xff09;&#xff0c;描述你想要实现的功能&#xff0c;Cursor 就能生成相应的代码。不满意&#xff1f;直接告诉它…...

C# SolidWorks 二次开发 -各种菜单命令增加方式

今天给大家讲一讲solidworks中各种菜单界面&#xff0c;如下图&#xff0c;大概有13处&#xff0c;也许还不完整哈。 1.CommandManager选项卡2.下拉选项卡3.菜单栏4.下级菜单5.浮动工具栏6.快捷方式工具栏7.FeatureManager工具栏区域8.MontionManager区域 ModelView?9.任务窗…...

三分钟掌握音频提取 | 在 Rust 中优雅地处理视频音频

前言 在多媒体开发中&#xff0c;从视频中提取音频是一个常见需求。比如&#xff0c;你可能需要分离背景音乐来单独欣赏&#xff0c;或者提取对白用于语音分析&#xff0c;甚至为视频生成字幕。无论目的如何&#xff0c;音频提取都是多媒体处理中的基础操作。 传统上&#xf…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例9,TableView15_09带排序的导出表格示例

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

Qt+FFmpeg+SDL2播放进度显示及定位播放

参考链接&#xff1a; https://avmedia.0voice.com/?id59815 https://www.cnblogs.com/xdao/archive/2013/06/13/ffmpeg_tutor07.html https://blog.csdn.net/qq_38204686/article/details/139888438 https://blog.csdn.net/qq_38694388/article/details/120684650 https:/…...

【C语言】深入理解指针(二):从数组到二维数组的指针魔法

前言 在C语言中&#xff0c;指针一直是一个神秘而强大的存在。它不仅可以帮助我们高效地操作内存&#xff0c;还能让代码更加灵活和高效。今天&#xff0c;我们就来深入探讨指针的多种用法&#xff0c;从数组到二维数组&#xff0c;一步步揭开指针的神秘面纱。 一、数组名的指…...

调用链路传递隐式参数

在不修改方法签名与参数定义的情况下&#xff0c;可以通过 RpcContext 上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递。 隐式参数传递支持以下两个方向&#xff1a; 从消费方到提供方&#xff0c;也就是在请求发起时&#xff0c;在方法参数…...

鸿蒙 元服务摘要

元服务&#xff08;原名原子化服务&#xff09;&#xff0c;是HarmonyOS提供的一种面向未来的服务提供方式&#xff0c;是有独立入口的&#xff08;用户可通过点击方式直接触发&#xff09;、免安装的&#xff08;无需显式安装&#xff0c;由系统程序框架后台安装后即可使用&am…...

Browser Use Web UI 本地部署完全指南:从入门到精通

文章目录 引言一、项目概述1.1 核心功能1.2 技术特点 二、环境准备2.1 系统要求2.2 必要工具 三、详细部署步骤3.1 获取项目代码3.2 配置 Python 环境3.3 安装项目依赖3.4 环境配置3.5 启动应用 四、DeepSeek-V1 模型配置4.1 基础配置 五、执行Browser Use六、故障排查指南6.1 …...

Python元组

# coding: utf-8 print(-----------元组:不可变-----------)元组诗Python中内置的不可变序列 元素与元素之间使用英文的逗号分隔 元组中只有一个元素的时候&#xff0c;逗号也不能省略 元组的创建方式&#xff1a; (1)使用()直接创建元组 元组名 (element1,element2,element3,…...

物理环境与安全

物理安全的重要性 信息系统安全战略的一个重要组成部分物理安全面临问题 环境风险不确定性人类活动的不可预知性 典型的物理安全问题 自然灾害环境因素设备安全、介质安全、传输安全 场地选择 区域&#xff1a;避开自然灾害高发区环境&#xff1a;原理可能的危险因素抗震&…...

智慧医疗解决方案

1. 智慧医疗的兴起 智慧医疗作为智慧城市的关键部分&#xff0c;正逐渐成为医疗卫生体制改革的焦点。随着移动医疗和精准医疗的发展&#xff0c;智慧医疗解决方案变得触手可及&#xff0c;依托政策驱动和社会需求&#xff0c;致力于实现“以人为本、信息惠民”的目标。 2. 政…...

MySQL -- 复合查询

数据库的查询是数据库使用中比较重要的环节&#xff0c;前面的基础查询比较简单&#xff0c;不做介绍&#xff0c;可自行查阅。本文主要介绍复合查询&#xff0c;并结合用例进行讲解。 本文的用例依据Soctt模式的经典测试表&#xff0c;可以自行下载&#xff0c;也可以自己创建…...

【最后203篇系列】022 用Deepseek14b提取新闻事件

这算是之前一直想做的一件事&#xff0c;趁周末赶快做了。 业务意义&#xff1a;现实中有大量的舆情&#xff0c;这对我们的决策会有比较重要的作用 技术依赖&#xff1a; 1 模型基础能力2 消息队列3 异步获取消息4 时间序列库 1 模型基础能力 大模型发展到现在&#xff0…...

关于网络的一点知识(持续更新)

1、IP地址和子网掩码、端口号&#xff1a; IP地址是设备在网络上的地址&#xff0c;相当于一栋房子的门牌号。子网掩码相当于房子所在的街道。同一条街道的房子间是通过街道直通的&#xff0c;主人可以互相拜访。 举个例子&#xff0c;如下图所示。 说明&#xff1a;将两台设…...

2025年01月02日浙江鼎永前端面试

目录 webpack 和 vite 区别react fiber 架构vue diff 算法react diff 算法hooks 源码垂直水平布局项目介绍单点登录大文件上传微前端 1. webpack 和 vite 区别 Webpack 和 Vite 是两种不同的前端构建工具&#xff0c;它们在设计理念、性能表现和使用场景上存在显著差异。以下…...