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

网络编程(一)网络编程入门

本节课学习TCP客户端和服务器端编程架构,其分为分为C/S(客户端/服务器模式)和B/S(浏览器/服务器架构模式)两种模式。接下来我们分别了解这两种模式

C/S模式

C/S模式:服务器首先先启动,并根据客户端请求做出相应的响应。

服务器:

1.打开一个通信通道,在某一端口接受客户端请求。

2.接受到客户端请求后处理请求并返回信息给客户端。

3.继续等待客户端请求直到关闭服务器。

客户端:

1.打开一个通信通道,并连接到服务器所在主机的特定端口。

2.向服务器发送请求,等待并接收响应,继续发送请求。

3.关闭客户端。

B/S模式

B/S模式:浏览器是客户端的主要应用软件,主要事物逻辑在服务器实现,前端(浏览器)负责展示。

WinSocket

Windows Sockets 规范是一套开放的、支持多协议的Windows下的网络编程接口。目前实际应用中的Windwos Sockets规范主要有1.1版本和2.2版本,其中1.1版本只支持TCP/IP协议,而2.2支持多协议,并具有良好的向后兼容性。这俩版本对应的头文件分别是:WinSocket.h WinSocket2.h

Socket传输

socket通常被称作套接字,是网络通信的编程接口,本质是​操作系统提供的双向通信端点​​。客户端去连接服务器端,需要一对套接字,一个运行在服务器端,一个运行在客户端。套接字处于网络协议的传输层,用于实现服务器和客户端之间的物理连接,并进行数据传输。传输层主要有UDP和TCP两个协议:

TCP协议:TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂

UDP协议:UDP是一个非连接的协议,传输数据之前源端和终端不建立连接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、 计算机的能力和传输带宽的限制; 在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段

工作原理如下:

服务器端:创建套接字 → 绑定IP和端口 → 监听连接 → 接受客户端请求 → 数据传输 → 关闭连接

客户端:创建套接字 → 连接服务器 → 数据传输 → 关闭连接

相关背景知识

字节序:字节与存储位置的关系

小端:将低序字节存储在起始地址

大端:将高序字节存储在起始地址

网络字节序:网络上的字节序

代码实现

接下来我们将通过代码实现一个简单TCP/IP服务器和客户端的一般模型

服务端代码实现

服务端的实现有以下几个步骤:

1. 初始化Winsock

WORD wsVersion = MAKEWORD(2, 2);
WSADATA wsaData = {0}; 
WSAStartup(wsVersion, &wsaData);

2. 创建套接字

//创建套接字需要使用函数socket(),其语法如下:
SOCKET socket
(int af,       // 地址族规范:常见有IPv6(AF_INET6)或IPv4(AF_INET)int type,     // 套接字类型:原始套接字SOCKET_RAW(对较低层次的协议直接访问,例如IP、ICMP协议)、SOCK_STREAM面向连接(TCP/IP协议)、SOCK_DGRAM面向无连接(UDP协议)int protocol  // 使用的协议:这里我们可以直接写0,这样操作系统就会根据前面两个选项推断出你想用的协议
);//实现代码
SOCKET sSocket = socket(AF_INET, SOCK_STREAM, 0);

3. 绑定套接字

//绑定套接字,需要使用函数bind,其语法如下:
int bind
(SOCKET s,                          // 套接字:将创建的套接字变量名字写上去const struct sockaddr FAR *name,   // 网络地址信息:包含通信所需要的相关信息,传递的是一个sockaddr结构体,在具体传参的时候,会用该结构体的变体sockaddr_in形式去初始化相关字段int namelen                        // sockaddr_in结构体的长度
);//其中sockaddr_in结构体的定义如下:
struct sockaddr_in 
{short   sin_family; // 地址族规范:与创建套接字时候所使用的一致即可u_short sin_port; // 端口struct  in_addr sin_addr; // IP地址char    sin_zero[8]; // 无特殊的含义,只是为了与sockaddr结构体一致,因为在给套接字分配网络地址的时候会调用bind函数,其中的参数会把sockaddr_in结构体转化为sockaddr结构体
};//其中in_addr结构体的定义如下:
struct in_addr 
{union {struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;struct { u_short s_w1,s_w2; } S_un_w;u_long S_addr;} S_un;#define s_addr  S_un.S_addr/* can be used for most tcp & ip code */#define s_host  S_un.S_un_b.s_b2/* host on imp */#define s_net   S_un.S_un_b.s_b1/* network */#define s_imp   S_un.S_un_w.s_w2/* imp */#define s_impno S_un.S_un_b.s_b4/* imp # */#define s_lh    S_un.S_un_b.s_b3/* logical host */
};//网络地址是一个u_long类型的地址,因此我们可以使用函数inet_addr将字符串按照网络字节序进行转换
inet_addr("192.168.1.1");//代码实现
sockaddr_in sockAddrInfo = {0};    // 初始化
sockAddrInfo.sin_addr.S_un.S_addr = inet_addr("192.168.1.1"); // 地址
sockAddrInfo.sin_port = htons(2118); // 端口需要按照网络字节序,所以需要使用htons函数
sockAddrInfo.sin_family = AF_INET; // 地址族规范
bind(sSocket, (sockaddr*)&sockAddrInfo, sizeof(sockAddrInfo));

4. 监听套接字

//监听套接字,使用函数listen,其语法如下:
int listen
(SOCKET s,    // 套接字:将创建的套接字变量名字写上去int backlog  // 待处理连接队列的最大长度:表示队列中最多同时有多少个连接请求
);// 实现代码
listen(sSocket, 1);

5. 等待客户端连接

//等待连接,使用函数accept,其语法如下:
SOCKET accept
(SOCKET s, // 套接字:将创建的套接字变量名字写上去struct sockaddr FAR *addr, // 输出参数,需要传入一个sockaddr结构体的地址int FAR *addrlen // 输出参数,需要传入一个sockaddr结构体长度的地址
);//实现代码,accept返回的也是一个SOCKET
sockaddr_in acceptSockAddrInfo = {0}; // 初始化
int acceptSockAddrLen = 0;
SOCKET aSocket = accept(sSocket, (sockaddr*)&acceptSockAddrInfo, &acceptSockAddrLen);

6. 接收和发送数据

//接收数据使用函数recv,其语法如下:
int recv
(SOCKET s,       // 套接字:将accept返回的套接字变量名字写上去char FAR *buf,  // 输出参数,数据缓冲区,接收到的数据int len,        // 缓冲区大小int flags       // 指定调用方式的标志,这个我们就直接写0即可
);//实现代码
char buf[100] = {0};
recv(aSocket, buf, 100, 0);
printf("Recv data: %s\n", buf);//发送数据使用函数send,其语法如下:int send
(SOCKET s,             // 套接字:将accept返回的套接字变量名字写上去const char FAR *buf,  // 传输数据的缓冲区int len,              // 缓冲区大小int flags             // 指定调用方式的标志,这个我们就直接写0即可
);//实现代码
send(aSocket, buf, strlen(buf)+1, 0);

7. 被动断开连接

//断开连接使用shutdown函数,其语法如下:
int shutdown
(SOCKET s,  // 套接字:将accept返回的套接字变量名字写上去int how    // 断开连接的形式:SD_SEND不再发送数据、SD_RECEIVE不再接受数据、SD_BOTH不再收发数据
);// 实现代码
shutdown(aSocket, SD_SEND);

8.关闭套接字

//关闭2个套接字=使用函数closesocket,其语法如下:
int closesocket
(SOCKET s  // 套接字:将accept返回的套接字变量名字写上去
);// 实现代码
closesocket(aSocket);
closesocket(sSocket);

 完整代码如下:

#include<WinSock2.h>//Winsock2头文件需置于Windows.h之前,避免旧版Winsock1.1头文件冲突
#include<Windows.h>
#include<iostream>
#include<WS2tcpip.h>#pragma comment(lib,"ws2_32.lib")//显式链接Winsock2库ws2_32.libint main(int argc, char* argv[])
{// 1. 初始化WinsockWORD wsVersion = MAKEWORD(2, 2);WSADATA wsaData = {0};WSAStartup(wsVersion, &wsaData);// 2. 创建套接字SOCKET sSocket = socket(AF_INET, SOCK_STREAM, 0);if (SOCKET_ERROR == sSocket) {printf("套接字闯创建失败!\n" );}else {printf("套接字闯创建成功!\n" );}3. 绑定套接字sockaddr_in sockAddrInfo = {0};    // 初始化sockAddrInfo.sin_addr.S_un.S_addr = inet_addr("172.16.176.5");sockAddrInfo.sin_port = htons(2118); // 端口sockAddrInfo.sin_family = AF_INET; // 地址族规范int bRes = bind(sSocket, (sockaddr*)&sockAddrInfo, sizeof(sockAddrInfo));if (SOCKET_ERROR == bRes) {printf("绑定失败!\n");}else {printf("绑定成功!\n");}// 3. 监听套接字int lRes = listen(sSocket, 1);if (SOCKET_ERROR == lRes) {printf("监听失败!\n");}else {printf("监听成功!\n");}4. 监听套接字sockaddr_in acceptSockAddrInfo = {0};    // 初始化int acceptSockAddrLen = sizeof(acceptSockAddrInfo);5. 等待客户端连接SOCKET aSocket = accept(sSocket, (sockaddr*)&acceptSockAddrInfo, &acceptSockAddrLen);if (INVALID_SOCKET == aSocket) {printf("服务端等待连接失败!\n");}else {printf("服务端等待连接成功!\n");}6. 接收和发送数据char buf[100] = {0};// 循环while (true) {int ret = recv(aSocket, buf, 100, 0);if (ret == 0) {// 如果recv返回为0则表示客户端要断开连接,就跳出循环断开连接break;}printf("Recv data: %s\n", buf);send(aSocket, buf, strlen(buf)+1, 0);memset(buf, 0, 100);}// 7. 断开连接shutdown(aSocket, SD_SEND);// 8.关闭套接字closesocket(aSocket);closesocket(sSocket);// 9. 释放 Winsock 库资源 WSACleanup();return 0;
}

客户端代码实现

客户端的实现有以下几个步骤:

1. 初始化Winsock

2. 创建套接字

3. 绑定套接字

4. 连接服务器

5. 发送和接收数据

6. 主动断开连接

7. 关闭套接字

#include<WinSock2.h>
#include<Windows.h>
#include<iostream>
#include<WS2tcpip.h>#pragma comment(lib,"ws2_32.lib")int main()
{// 1. 初始化WinsockWORD wsVersion = MAKEWORD(2, 2);WSADATA wsaData = {0};WSAStartup(wsVersion, &wsaData);// 2. 创建套接字SOCKET cSocket = socket(AF_INET, SOCK_STREAM, 0);if (SOCKET_ERROR == cSocket) {printf("套接字闯创建失败!\n");}else {printf("套接字闯创建成功!\n");}// 3. 绑定套接字sockaddr_in sockAddrInfo = {0};    // 初始化sockAddrInfo.sin_addr.S_un.S_addr = inet_addr("172.16.176.12");sockAddrInfo.sin_port = htons(2119); // 端口sockAddrInfo.sin_family = AF_INET; // 地址族规范int bRes = bind(cSocket, (sockaddr*)&sockAddrInfo, sizeof(sockAddrInfo));if (SOCKET_ERROR == bRes) {printf("绑定失败!\n");}else {printf("绑定成功!\n");}// 4. 连接服务器sockaddr_in serverSockAddrInfo = {0};    // 初始化serverSockAddrInfo.sin_addr.S_un.S_addr = inet_addr("172.16.176.5");serverSockAddrInfo.sin_port = htons(2118); // 端口serverSockAddrInfo.sin_family = AF_INET; // 地址族规范int cRes = connect(cSocket, (sockaddr*)&serverSockAddrInfo, sizeof(serverSockAddrInfo));if (SOCKET_ERROR == cRes) {printf("与服务器连接失败!\n");}else {printf("与服务器连接成功!\n");}// 5. 发送和接收数据printf("Input: ");char sendData[100];scanf("%s", sendData);send(cSocket, sendData, strlen(sendData)+1, 0);char buf[100] = {0};recv(cSocket, buf, 100, 0);printf("Recv data: %s \n", buf);// 6. 主动断开连接shutdown(cSocket, SD_SEND);// 7. 关闭套接字closesocket(cSocket);WSACleanup();return 0;
}

多人聊天功能

在多人聊天中,有多个客户端对应一个服务器端。当某客户端发送消息时,由服务器端接收消息并转发给其他客户端

服务器端

#include<WinSock2.h>
#include<Windows.h>
#include<iostream>
#include<WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#include<vector>using std::vector;
vector<SOCKET> clientList;//用于存储多个客户端DWORD WINAPI revcMeesage(LPVOID param)
{SOCKET client = (SOCKET)param;char buff[0x100]{ 0 };int recvSize = 0;while ((recvSize=recv(client, buff,0x100,0))>0){for (int i=0;i<clientList.size();i++){if (clientList[i]!= client){send(clientList[i],buff, recvSize,0);//服务器发送给其他客户端}}}for (int i = 0; i < clientList.size(); i++){if (clientList[i] == client){closesocket(clientList[i]);clientList.erase(clientList.begin()+i);printf("客户端%u断开了连接!\n");}}return 0;
}
int main()
{//1.初始化网络环境WSADATA data{ 0 };WSAStartup(MAKEWORD(2, 2), &data);//2.创建SOCKETSOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//3绑定端口号IP地址sockaddr_in serverAddr{ 0 };serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(8888);inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr);bind(server, (SOCKADDR*)&serverAddr, sizeof(serverAddr));//4.监听listen(server, SOMAXCONN);//5.接受会话sockaddr_in clientAddr{ 0 };int size = sizeof(clientAddr);while (1){SOCKET client = accept(server, (SOCKADDR*)&clientAddr, &size);clientList.push_back(client);CreateThread(NULL,NULL, revcMeesage, (LPVOID)client,NULL,NULL);printf("客户端%u连接到了服务器\n", client);}closesocket(server);return 0;
}

客户端

#include<Windows.h>
#include<iostream>
#include<WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
DWORD WINAPI revcMeesage(LPVOID param)
{SOCKET client = (SOCKET)param;char buff[0x100]{ 0 };while (recv(client, buff, 0x100, 0)>0){printf("%s\n",buff);}return 0;
}int main()
{//1.初始化网络环境WSADATA data{ 0 };WSAStartup(MAKEWORD(2, 2), &data);//2.创建SOCKETSOCKET client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//3绑定端口号IP地址sockaddr_in serverAddr{ 0 };serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(8888);inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr);int result = connect(client, (SOCKADDR*)&serverAddr, sizeof(serverAddr));if (result != 0){printf("连接服务器失败!\n");}HANDLE hthread=CreateThread(NULL, NULL, revcMeesage, (LPVOID)client, NULL, NULL);char buff[0x100]{0};while (scanf_s("%s", buff,0x100) && strcmp(buff,"exit")){send(client,buff,strlen(buff)+1,0);}closesocket(client);CloseHandle(hthread);return 0;
}

 

相关文章:

网络编程(一)网络编程入门

本节课学习TCP客户端和服务器端编程架构&#xff0c;其分为分为C/S&#xff08;客户端/服务器模式&#xff09;和B/S&#xff08;浏览器/服务器架构模式&#xff09;两种模式。接下来我们分别了解这两种模式 C/S模式 C/S模式&#xff1a;服务器首先先启动&#xff0c;并根据客…...

黑名单中的随机数-leetcode710

题目描述 给定一个整数 n 和一个 无重复 黑名单整数数组 blacklist 。设计一种算法&#xff0c;从 [0, n - 1] 范围内的任意整数中选取一个 未加入 黑名单 blacklist 的整数。任何在上述范围内且不在黑名单 blacklist 中的整数都应该有 同等的可能性 被返回。 优化你的算法&am…...

纯Java实现反向传播算法:零依赖神经网络实战

在深度学习框架泛滥的今天,理解算法底层实现变得愈发重要。反向传播(Backpropagation)作为神经网络训练的基石算法,其实现往往被各种框架封装。本文将突破常规,仅用Java标准库实现完整BP算法,帮助开发者: 1) 深入理解BP数学原理。2) 掌握面向对象的神经网络实现。3) 构建可…...

海纳思(Hi3798MV300)机顶盒遇到海思摄像头

海纳思机顶盒遇到海思摄像头&#xff0c;正好家里有个海思Hi3516的摄像头模组开发板&#xff0c;结合机顶盒来做个录像。 准备工作 海纳斯机顶盒摄像机模组两根网线、两个电源、路由器一块64G固态硬盘 摄像机模组和机顶盒都接入路由器的LAN口&#xff0c;确保网络正常通信。 …...

MCP项目实例 - client sever交互

1. 项目概述 项目目标 构建一个本地智能舆论分析系统。 利用自然语言处理和多工具协作&#xff0c;实现用户查询意图的自动理解。 进行新闻检索、情绪分析、结构化输出和邮件推送。 系统流程 用户查询&#xff1a;用户输入查询请求。 提取关键词&#xff1a;从用户查询中…...

Axure应用交互设计:表格跟随菜单移动效果(超长表单)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!本文如有帮助请订阅 Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:表格跟随菜单移动 主要内容:表格交互设计、动态面板嵌套、拖动时事件、移动动作 应用场景…...

7系列 之 I/O标准和终端技术

背景 《ug471_7Series_SelectIO.pdf》介绍了Xilinx 7 系列 SelectIO 的输入/输出特性及逻辑资源的相关内容。 第 1 章《SelectIO Resources》介绍了输出驱动器和输入接收器的电气特性&#xff0c;并通过大量实例解析了各类标准接口的实现。 第 2 章《SelectIO Logic Resource…...

github 上的 CI/CD 的尝试

效果 步骤 新建仓库设置仓库的 page 新建一个 vite 的项目&#xff0c;改一下 vite.config.js 中的 base 工作流 在项目的根目录下新建一个 .github/workflows/ci.yml 文件&#xff0c;然后编辑一下内容 name: Build & Deploy Vue 3 Appon:push:branches: [main]permi…...

Scala和Go差异

Scala和Go&#xff08;又称Golang&#xff09;是两种现代编程语言&#xff0c;各自具有独特的特性和设计哲学。 尽管它们都可以用于构建高性能、可扩展的应用程序&#xff0c;但在许多方面存在显著差异。 Scala和Go的详细比较&#xff0c;涵盖它们的异同点&#xff1a; 1. 语…...

yup 使用 3 - 利用 meta 实现表单字段与表格列的统一结构配置(适配 React Table)

yup 使用 3 - 利用 meta 实现表单字段与表格列的统一结构配置&#xff08;适配 React Table&#xff09; Categories: Tools Last edited time: May 11, 2025 7:45 PM Status: Done Tags: form validation, schema design, yup 本文介绍如何通过 Yup 的 meta() 字段&#xff0…...

类初始化方法

一、类初始化方法 成员初始化列表 class Point {int x, y; public:Point(int a, int b) : x(a), y(b) {} };就地初始化&#xff08;C11&#xff09; 声明时初始化。 class Widget {int size 10; // 类内成员初始化vector<int> data{1,2,3}; };特殊情况&#xff1a;静…...

【OpenCV】imread函数的简单分析

目录 1.imread()1.1 imread()1.2 imread_()1.2.1 查找解码器&#xff08;findDecoder&#xff09;1.2.2 读取数据头&#xff08;JpegDecoder-->readHeader&#xff09;1.2.2.1 初始化错误信息&#xff08;jpeg_std_error&#xff09;1.2.2.2 创建jpeg解压缩对象&#xff08;…...

【Linux实践系列】:进程间通信:万字详解共享内存实现通信

&#x1f525; 本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生就像一场马拉松&#xff0c;重要的不是起点&#xff0c;而是坚持到终点的勇气 ★★★ 本文前置知识&#xff1a; …...

【笔记】BCEWithLogitsLoss

工作原理 BCEWithLogitsLoss 是 PyTorch 中的一个损失函数&#xff0c;用于二分类问题。 它结合了 Sigmoid 激活函数和二元交叉熵&#xff08;Binary Cross Entropy, BCE&#xff09;损失在一个类中。 这不仅简化了代码&#xff0c;而且通过数值稳定性优化提高了模型训练的效…...

Oracle SYSTEM/UNDO表空间损坏的处理思路

Oracle SYSTEM/UNDO表空间损坏是比较棘手的故障&#xff0c;通常会导致数据库异常宕机进而无法打开数据库。数据库的打开故障处理起来相对比较麻烦&#xff0c;读者可以参考本书第5章进一步了解该类故障的处理过程。如果数据库没有备份&#xff0c;通常需要设置官方不推荐的隐含…...

为什么 cout<<“中文你好“ 能正常输出中文

一, 简答: 受python3字符串模型影响得出的下文C字符串模型结论 是错的&#xff01;C的字符串和python2的字符串模型类似&#xff0c;也就是普通的字符串是ASCII字符串和字节串两种语义&#xff0c;类似重载或多态&#xff0c;有时候解释为整数&#xff0c;有时候是字节串。Uni…...

Leetcode 3547. Maximum Sum of Edge Values in a Graph

Leetcode 3547. Maximum Sum of Edge Values in a Graph 1. 解题思路2. 代码实现 题目链接&#xff1a;3547. Maximum Sum of Edge Values in a Graph 1. 解题思路 这一题主要是在问题的分析上面。由题意易知&#xff0c;事实上给定的图必然只可能存在三种可能的结构&#x…...

关于Go语言的开发环境的搭建

1.Go开发环境的搭建 其实对于GO语言的这个开发环境的搭建的过程&#xff0c;类似于java的开发环境搭建&#xff0c;我们都是需要去安装这个开发工具包的&#xff0c;也就是俗称的这个SDK&#xff0c;他是对于我们的程序进行编译的&#xff0c;不然我们写的这个代码也是跑不起来…...

Flutter PIP 插件 ---- 为iOS 重构PipController, Demo界面,更好的体验

接上文 Flutter PIP 插件 ---- 新增PipActivity&#xff0c;Android 11以下支持自动进入PIP Mode 项目地址 PIP&#xff0c; pub.dev也已经同步发布 pip 0.0.3&#xff0c;你的加星和点赞&#xff0c;将是我继续改进最大的动力 在之前的界面设计中&#xff0c;还原动画等体验一…...

Redis 基本命令与操作全面解析:从入门到实战

前言 Redis 作为高性能内存数据库&#xff0c;其丰富的命令体系是发挥强大功能的基础。掌握 Redis 的基本命令&#xff0c;不仅能实现数据的高效读写&#xff0c;还能深入理解其内存模型与工作机制。本文将系统梳理 Redis 的核心命令&#xff0c;涵盖连接操作、键管理、数据类…...

数据库管理-第325期 ADG Failover后该做啥(20250513)

数据库管理325期 2025-05-13 数据库管理-第325期 ADG Failover后该做啥&#xff08;20250513&#xff09;1 故障处置2 恢复原主库3 其他操作总结 数据库管理-第325期 ADG Failover后该做啥&#xff08;20250513&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&a…...

SQLi-Labs 第21-24关

Less-21 http://127.0.0.1/sqli-labs/Less-21/ 1&#xff0c;抓个请求包看看 分析分析cookie被base64URL编码了&#xff0c;解码之后就是admin 2&#xff0c;那么这个网站的漏洞利用方式也是和Less-20关一样的&#xff0c;只是攻击语句要先base64编码&#xff0c;再URL编码&…...

Oracle — 数据管理

介绍 Oracle数据库作为全球领先的关系型数据库管理系统&#xff0c;其数据管理能力以高效性、安全性和智能化为核心。系统通过多维度技术实现海量数据的存储与实时处理&#xff0c;支持高并发事务操作与复杂分析查询&#xff0c;满足企业关键业务需求。在安全领域&#xff0c;O…...

在 Qt Creator 中为 QDockWidget 设置隐藏和显示按钮

在 Qt Creator 中为 QDockWidget 设置隐藏和显示按钮 是的&#xff0c;QDockWidget 内置了隐藏和显示的功能&#xff0c;可以通过以下几种方式实现&#xff1a; 1. 使用 QDockWidget 自带的关闭按钮 QDockWidget 默认带有一个关闭按钮&#xff0c;可以通过以下代码启用&…...

LS-NET-012-TCP的交互过程详解

LS-NET-012-TCP的交互过程详解 附加&#xff1a;TCP如何保障数据传输 TCP的交互过程详解 一、TCP协议核心交互流程 TCP协议通过三次握手建立连接、数据传输、四次挥手终止连接三大阶段实现可靠传输。整个过程通过序列号、确认应答、窗口控制等机制保障传输可靠性。 1.1 三次…...

每日算法刷题Day1 5.9:leetcode数组3道题,用时1h

1.LC寻找数组的中心索引(简单) 数组和字符串 - LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 思想: 计算总和和左侧和&#xff0c;要让左侧和等于右侧和&#xff0c;即左侧和总和-左侧和-当前数字 代码 c代码: class Solution { public:i…...

解构认知边界:论万能方法的本体论批判与方法论重构——基于跨学科视阈的哲学-科学辩证

一、哲学维度的本体论批判 &#xff08;1&#xff09;理性主义的坍缩&#xff1a;从笛卡尔幻想到哥德尔陷阱 笛卡尔在《方法论》中构建的理性主义范式&#xff0c;企图通过"普遍怀疑-数学演绎"双重机制确立绝对方法体系。然而哥德尔不完备定理&#xff08;Gdel, 19…...

PVE WIN10直通无线网卡蓝牙

在 Proxmox VE (PVE) 中直通 Intel AC3165 无线网卡的 **蓝牙模块**&#xff08;通常属于 USB 设备&#xff0c;而非 PCIe 设备&#xff09;需要特殊处理&#xff0c;因为它的蓝牙部分通常通过 USB 连接&#xff0c;而 Wi-Fi 部分才是 PCIe 设备。以下是详细步骤&#xff1a; …...

第六节第二部分:抽象类的应用-模板方法设计模式

模板方法设计模式的写法 建议使用final关键字修饰模板方法 总结 代码&#xff1a; People(父类抽象类) package com.Abstract3; public abstract class People {/*设计模板方法设计模式* 1.定义一个模板方法出来*/public final void write(){System.out.println("\t\t\t…...

在另一个省发布抖音作品,IP属地会随之变化吗?

你是否曾有过这样的疑惑&#xff1a;出差旅游时在外地发布了一条抖音视频&#xff0c;评论区突然冒出“IP怎么显示xx省了&#xff1f;”的提问&#xff1f;随着各大社交平台上线“IP属地”功能&#xff0c;用户的地理位置标识成为公开信息&#xff0c;而属地显示的“灵敏性”也…...