【网络编程】网络编程基础:TCP/UDP 协议
一、什么是网络?
网络是信息传输,接收和共享的虚拟世界,通过把网络上的信息汇聚在一起,将这些资源进行共享。
初衷:知识共享。这里不得不提到Internet 的历史-它其实是“冷战”的产物:
- 1957年10月和11月,前苏联先后有两颗“Sputnik”卫星上天。
- 1958年美国总统艾森豪威尔向美国国会提出建立DARPA (Defense Advanced Research Project Agency),即国防部高级研究计划署,简称ARPA。
- 1968年6月DARPA提出“资源共享计算机网络” (Resource Sharing Computer Networks),目的在于让DARPA的所有电脑互连起来,这个网络就叫做ARPAnet,即“阿帕网”,是 Interne 的最早雏形。
二、计算机中的软件层面,网络是由什么组成的?
1>IP//定义IP地址是一种因特网上的主机编址方式,也称为网际协议地址IP,是任意一台主机在网络中的唯一标识。//格式点分十进制:用户编写,给人看的 192.168.30.100网络二进制:给系统看的 0 1//分类IPv4:(主要集中在电脑)点分十进制:4个字节网络二进制:32个位(42亿个IP地址)由网络地址(子网ID)和主机地址(主机ID)构成IPv6:(主要用在手机WiFi,目前电脑上用得不多)点分十进制:16个字节网络二进制:128个位IPv4地址分类:A/B/C/D/E分别应用于大型网、中型网、中小型网、组播型、待用型//A类地址:政府机关或者学校等大型网络#规则:以0开头,8位的网络地址(子网ID),24位的主机地址(主机ID)网络二进制:0000 0000 0000 0000 0000 0000 0000 0001 - 0111 1111 1111 1111 1111 1111 1111 1110点分十进制: 0.0.0.1 - 127.255.255.254//B类地址:中等规模的企业使用#规则:以10开头,16位的网络地址(子网ID),16位的主机地址(主机ID)网络二进制:1000 0000 0000 0000 0000 0000 0000 0001 - 1011 1111 1111 1111 1111 1111 1111 1110点分十进制: 128.0.0.1 - 191.255.255.254//C类地址:任意个人使用 *#规则:以110开头,24位的网络地址(子网ID),8位的主机地址(主机ID)网络二进制:1100 0000 0000 0000 0000 0000 0000 0001 - 1101 1111 1111 1111 1111 1111 1111 1110点分十进制: 192.0.0.1 - 223.255.255.254//D类地址(组播地址):4个字节都是网络地址 *#规则:以1110开头,32位的网络地址(子网ID),0位的主机地址(主机ID)网络二进制:1110 0000 0000 0000 0000 0000 0000 0001 - 1110 1111 1111 1111 1111 1111 1111 1110点分十进制: 224.0.0.1 - 239.255.255.254//E类地址:未使用的地址 -- 测试地址#规则:以11110开头,留着待用前三位:判断类别A: 000B: 100C: 110D: 111注意:有两个地址不能使用/**主机地址(主机ID)全为0,它是网段号、网络号主机地址(主机ID)全为1,它是广播地址**/端口号:标识计算机上的进程取值范围: 0~2^16 -1//特点网络地址不同的网络不能直接通信,如果要通信须通过路由器进行转发2>子网掩码//定义子网掩码又叫网络掩码、地址掩码,是一个32位由1和0组成的数值,并且1和0都是连续//作用指明IP地址中哪些位表示为子网ID,哪些位表示为主机ID//特点必须结合IP地址一起使用,不能单独存在IP地址中由子网掩码中1覆盖的连续位为子网ID,其余为主机ID//以C类地址为例192.168.30.100/255.255.255.0192.168.30.100/24前缀长度:243>网关用来管理当前网段下的信息传输、网络的门户,默认取值为1,192.168.30.1,随机取值(1 - 254)4>DNS域名解析器DNS的作用类似于电话簿,将域名和IP地址相对应,使得用户可以通过域名来访问网站,不要记忆复杂的IP地址www.baidu.com - 183.2.172.42
三、网络体系结构
网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务。网络体系结构即指 网络的层次结构和每层所使用协议的集合。
两类非常重要的体系结构:OSI 与 TCP/IP
OSI开放系统互联模型
OSI模型相关的协议已经很少使用,但模型本身非常通用;OSI模型是一个理想化的模型,尚未有完整的实现,OSI模型共有七层:
1>OSI七层模型应用层 应用程序:FTP、E-mail、Telnet----------------------表示层 数据格式定义、数据转换/加密----------------------会话层 建立通信进程的逻辑名字与物理名字之间的联系 ----------------------传输层 差错处理/恢复,流量控制,提供可靠的数据传输----------------------网络层 数据分组、路由选择----------------------链路层 数据组成可发送、接收的帧----------------------物理层 传输物理信号、接口、信号形式、速率目的:将数据封装,形成一个约定好的通信协议协议:双方约定好的通信规则缺点:太复杂,太过理想化,有些层的功能重复
双方通信需要保证协议一致
2>TCP/IP协议族的体系结构重点学习的体系结构,网络协议中的世界语、标准语应用层 应用程序:FTP、E-mail、Telnet -- http(超文本传输协议) DNS POP3(邮件接收协议) STMP(邮件发送协议)----------------------传输层 TCP/UDP -- 确定数据包交给主机上的那个进程----------------------网络层 IP/ICMP/IGMP----------------------网络接口和物理层 网卡驱动和物理接口/**传输层:TCP/UDPTCP:微信视频电话 --- 保证对方接了之后才能通信 -- 文件传输、聊天UDP:微信发消息 --- 只管发,不管对方有无接收 -- 视屏传输网络层:IP:主机的唯一标识ICMP:网络控制消息协议,用于ping命令的实现IGMP:网络组管理协议,用于广播、组播的实现 **//**网络接口和物理层:网卡:让不同的计算机之间连接,从而实现数据的通信等功能(有线网卡和无线网卡)mac(物理地址):网卡的标识号(48位),类似于身份证号,理论上全球唯一物理地址: 00:0c:29:14:84:69 前三组称为厂商ID,后三组为设备IDARP 将IP地址转换为MAC地址 RARP 将MAC地址转换为IP地址 **/3>数据的封装与传递过程见 数据的封装与传递过程(如下图所示)封装的目的:保证数据稳定可靠地传输
发送端 数据打包
接收端 数据解包
数据传输过程:
层层封装 ---> 层层解封["疯狂星期四Vme50"] ---> 应用层[TCP/UDP 头]["疯狂星期四Vme50"] ---> 传输层[IP 头][TCP/UDP 头]["疯狂星期四Vme50"] ---> 网络层[ARP 头][IP 头][TCP/UDP 头]["疯狂星期四Vme50"] ---> 物理接口层|将打包好的数据发送出去数据在网络中都是以帧的形式发送 [ARP 头][IP 头][TCP/UDP 头]["疯狂星期四Vme50"] -- 1帧数据[IP 头][TCP/UDP 头]["疯狂星期四Vme50"] -- 最大 1500个 字节
TCP/IP 协议下的数据包:
4>端口号类似于PID表示一个进程,区分不同的网络应用程序例如:QQ 4399 微信 17173无符号短整型 unsigned short 2个字节 0 ~ 655351 ~ 1023 系统进程使用1024 ~ 5000 系统分配的端口5001 ~ 65535 用户自己分配使用的问:为什么有进程PID了,还要搞一个端口号来区分不同的应用程序?答:根据进程运行被分配的进程号不固定,但想以固定的序号去访问指定的应用程序,便有了端口号5>大小端序不同类型CPU主机中,内存存储的整数字节序分为以下两种:小端序(little-endian)低位字节存储在低位地址 linux,x86平台大端序(big-endian)低位字节存储在高位地址 网络字节序//用于大小端序转换的工具函数#include <arpa/inet.h>//主机字节序转换为网络字节序(小端序转换为大端序)uint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);//网络字节序转换为主机字节序(大端序转换为小端序)uint32_t ntohl(uint32_t netlong);uint16_t ntohs(uint16_t netshort);6>网络通信模型:C/S : 服务器 + 客户端B/S : 网页端 http https
如果把网络数据包的投递过程看成是给远方的一位朋友寄一封信,那么: IP地址就是这位朋友的所在位置,如上海交大XX系,邮局依靠此信息进行信件的投递,网络数据则依靠IP地址信息进行路由,端口号就是这位朋友的名字,传达室依靠这个信息最终把这封信交付给这位收信者,数据包则依靠端口号送达给接收进程。
四、TCP/UDP的特点和区别
都采用经典的C/S模型,即客户端(client)服务器(server)模型。
不同点:TCP:有连接,可靠;UDP:无连接,不保证可靠。
1》TCP: 面向链接的可靠协议 -- 1对1私聊//定义是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)借助于C/S模型搭建TCP通信:服务器(while(1)) 客户端1>建立socket连接 -- 买手机 1> 建立socket连接 -- 买手机2>绑定IP和端口号 -- 办电话卡 2> 连接服务器 3>监听 -- 开机 3> 收/发 4>等待连接 -- 等别人打电话 5>收/发 //功能提供不同主机上的进程通信//特点1.建立连接->使用连接->释放连接2.TCP数据包中包含序号和确认序号3.对包进行排序并排错,而损坏的包可以被重传//适用情况:适合于对传输质量要求较高,以及传输大量数据的通信。在需要可靠数据传输的场合,通常使用TCP协议sMSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议/**********************************************************************TCP的建立连接和断开连接标识符:ACK:确认标识符FIN:断开标识符SYN:请求标识符 -- 请求服务器连接URG:紧急标识符PSH:推标识TCP的三次握手: (如何打通电话)1.客户端给服务器发送SYN连接请求2.服务器回复ACK,并给客户端发送连接请求3.客户端回复ACK TCP的四次挥手: (如何挂断电话)1.客户端给服务器发送FIN请求2.服务器回复ACK3.服务器给客户端发送FIN请求4.客户端回复请求ACK **********************************************************************/
2》UDP//定义是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。//功能提供不同主机上的进程通信//特点1.发送数据之前不需要建立连接2.不对数据包的顺序进行检查3.没有错误检测和重传机制//适用情况发送小尺寸数据(如对DNS服务器进行IP地址查询时)在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络)适合于广播/组播式通信中。MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输
TCP传输
五、基于TCP协议的网络通信模型
1》框架
/**框架**/服务器(server) 客户端(client)1.创建流式套接字:socket();|
2.绑定本地地址:bind();|
3.设置监听套接字:listen(); 1.创建流式套接字:socket();| |
4.等待客户端连接:accept(); 2.发送连接请求:connect();| |
5.开始和客户端通信:read()/recv(); 3.与服务器通信:write()/send();| |
6.断开连接:close(); 4.发送断开请求:close();
2》TCP编程相关的API函数1>socket创建套接字#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int socket(int domain, int type, int protocol);/**********************************************************************@brief: 创建一个特殊的文件描述符(具有网络属性)@domain: 地址族AF_UNIX, AF_LOCAL 用于本地进程间通信,域通信AF_INET IPv4 Internet protocols AF_INET6 IPv6 Internet protocols @type: SOCK_STREAM // 流式套接字SOCK_DGRAM // 数据报套接字SOCK_RAW // 原始套接字@protocol: 一般默认设置为0,表示前面两个参数有效@retval: 成功:返回具有网络属性的文件描述符失败:返回-1,并且设置全局错误码**********************************************************************/2>connect主动连接服务器(绑定IP和端口号)bind()#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);/**********************************************************************@brief: 主动连接服务器@sockfd: 客户端的唯一文件描述符@addr: 声明服务器的结构体指针@addrlen: 结构体的长度@retval: 成功:返回0失败:返回-1,并且设置全局错误码**********************************************************************//**********************************************************************************grep查询struct sockaddr{}的具体实现grep struct\ sockaddr\ { /usr/src/linux-headers-5.4.0-150-generic/include/* -rnvim /usr/src/linux-headers-5.4.0-150-generic/include/linux/socket.h +31=================================================================================ctags查询struct sockaddr{}的具体实现1》安装ctagssudo apt-get install ctags2》去到头文件所在的目录cd /usr/src/linux-headers-5.4.0-150-generic/include/3》生产ctags标签sudo ctags -R4》查询vim -t 类(例如:sockaddr)=================================================================================locate 文件名 用于查询该文件所在路径**********************************************************************/#通用地址结构struct sockaddr {sa_family_t sa_family; /* address family, AF_xxx */ //地址族 --> ip地址char sa_data[14]; /* 14 bytes of protocol address */ //IP + 端口号}; struct sockaddr{ u_short sa_family; // 地址族, AF_xxxchar sa_data[14]; // 14字节协议地址};// 该结构体不适用: 1>IP + Prot = 6 个字节,sa_data有14个字节,多的字节没法填充// 2>无法判断IP在前面还是Prot在前面/*问题:1.IP地址和端口号谁在前谁在后?2.IP地址和端口号总共占6个字节,多出来的8个字节怎么处理?*/#Internet协议地址结构struct sockaddr_in {__kernel_sa_family_t sin_family; /* Address family */__be16 sin_port; /* Port number */struct in_addr sin_addr; /* Internet address *//* Pad to size of `struct sockaddr'. */unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -sizeof(unsigned short int) - sizeof(struct in_addr)];}; struct sockaddr_in { u_short sin_family; // 地址族, AF_INET,2 bytesu_short sin_port; // 端口,2 bytesstruct in_addr sin_addr; // IPV4地址,4 bytes char sin_zero[8]; // 8 bytes unused,作为填充}; // internet address struct in_addr{in_addr_t s_addr; // u32 network address };/**点分十进制和网络二进制的相互转换函数**/ in_addr_t inet_addr(const char *cp);/**********************************************************************@brief: 点分十进制转换为网络二进制@cp: 字符串点分十进制@retval: 成功:返回网络二进制数失败:返回-1,并且设置全局错误码**********************************************************************/char *inet_ntoa(struct in_addr in);/**********************************************************************@brief: 网络二进制转换为点分十进制@cp: 网络二进制的结构体变量@retval: 成功:返回字符串点分十进制失败:返回-1,并且设置全局错误码**********************************************************************/3>send发送#include <sys/types.h>#include <sys/socket.h>ssize_t send(int sockfd, const void *buf, size_t len, int flags);/**********************************************************************@brief: 发送数据@sockfd: 套接字文件描述符@buf: 发送数据的容器@len: buf的长度(用strlen)@flags: 一般为0@retval: 成功:返回实际发送的字节数失败:返回-1,并且设置全局错误码**********************************************************************/4>close关闭#include <unistd.h>int close(int fd);5>recv接收#include <sys/types.h>#include <sys/socket.h>ssize_t recv(int sockfd, void *buf, size_t len, int flags);/**********************************************************************@brief: 接收数据@sockfd: 套接字文件描述符,注意如果是服务器应使用accept对应的套接字@buf: 接收数据的容器@len: buf的长度(用sizeof)@flags: 一般为0@retval: 成功:返回实际接收的字节数0:异常退出失败:返回-1,并且设置全局错误码**********************************************************************/6>bind绑定 #include <sys/types.h> /* See NOTES */#include <sys/socket.h>int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);/**********************************************************************@brief: 将IP地址和端口号与套接字绑定在一起@sockfd: 套接字文件描述符@addr: 服务器的地址信息的结构体指针@addrlen: 结构体的长度@retval: 成功:返回0失败:返回-1,并且设置全局错误码**********************************************************************/7>listen监听 #include <sys/types.h> /* See NOTES */#include <sys/socket.h>int listen(int sockfd, int backlog);/**********************************************************************@brief: 保护服务器,限制同一时间客户端最大的连接数量@sockfd: 套接字文件描述符@backlog: 同一时间最大连接数量@retval: 成功:返回实际发送的字节数失败:返回-1,并且设置全局错误码**********************************************************************/8>accept等待客户端的连接#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);/**********************************************************************@brief: 等待客户端连接(阻塞)@sockfd: 套接字文件描述符@addr: 客户端的结构体指针@addrlen: 结构体的长度的指针@retval: 成功:返回与客户端进行连接通信的文件描述符失败:返回-1,并且设置全局错误码**********************************************************************/
基于 TCP协议 的服务器-客户端通信模型的 C 语言代码示例
该代码实现了基本的网络通信框架,其中服务器监听客户端连接,接受连接后进行数据收发,客户端与服务器建立连接并进行数据交换。
TCP 服务器端代码(server.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080 // 服务器监听端口
#define BUFFER_SIZE 1024int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen = sizeof(address);char buffer[BUFFER_SIZE] = {0};// 1. 创建流式套接字if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("Socket failed");exit(EXIT_FAILURE);}// 2. 绑定本地地址address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("Bind failed");close(server_fd);exit(EXIT_FAILURE);}// 3. 设置监听套接字if (listen(server_fd, 3) < 0) {perror("Listen failed");close(server_fd);exit(EXIT_FAILURE);}printf("Server listening on port %d...\n", PORT);// 4. 等待客户端连接if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("Accept failed");close(server_fd);exit(EXIT_FAILURE);}printf("Client connected!\n");// 5. 开始和客户端通信while (1) {memset(buffer, 0, BUFFER_SIZE);int bytes_read = read(new_socket, buffer, BUFFER_SIZE);if (bytes_read <= 0) {printf("Client disconnected.\n");break;}printf("Received: %s\n", buffer);// 发送回复char *message = "Message received.";send(new_socket, message, strlen(message), 0);}// 6. 断开连接close(new_socket);close(server_fd);return 0;
}
TCP 客户端代码(client.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define SERVER_IP "127.0.0.1" // 服务器地址
#define PORT 8080 // 服务器端口
#define BUFFER_SIZE 1024int main() {int sock;struct sockaddr_in serv_addr;char buffer[BUFFER_SIZE] = {0};// 1. 创建流式套接字if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("Socket creation error");exit(EXIT_FAILURE);}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);// 2. 设置服务器地址if (inet_pton(AF_INET, SERVER_IP, &serv_addr.sin_addr) <= 0) {perror("Invalid address / Address not supported");close(sock);exit(EXIT_FAILURE);}// 3. 发送连接请求if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {perror("Connection failed");close(sock);exit(EXIT_FAILURE);}printf("Connected to server.\n");// 4. 与服务器通信while (1) {printf("Enter message: ");fgets(buffer, BUFFER_SIZE, stdin);buffer[strcspn(buffer, "\n")] = 0; // 去掉换行符send(sock, buffer, strlen(buffer), 0);memset(buffer, 0, BUFFER_SIZE);int bytes_read = read(sock, buffer, BUFFER_SIZE);if (bytes_read <= 0) {printf("Server disconnected.\n");break;}printf("Server: %s\n", buffer);}// 5. 发送断开请求close(sock);return 0;
}
运行步骤
- 编译代码
gcc server.c -o server
gcc client.c -o client
- 启动服务器
./server
- 启动客户端
./client
- 在客户端发送消息
客户端输入消息后,服务器会接收到并回复 Message received.
该代码实现了基于 TCP 协议的网络通信模型:
服务器:socket() 创建套接字bind() 绑定 IP 和端口listen() 监听连接accept() 接受客户端连接read()/send() 进行数据通信close() 断开连接
客户端:socket() 创建套接字connect() 连接服务器send()/read() 进行数据通信close() 断开连接
综上。希望该内容能对你有帮助,感谢!
以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!
相关文章:
【网络编程】网络编程基础:TCP/UDP 协议
一、什么是网络? 网络是信息传输,接收和共享的虚拟世界,通过把网络上的信息汇聚在一起,将这些资源进行共享。 初衷:知识共享。这里不得不提到Internet 的历史-它其实是“冷战”的产物: 1957年…...
idea 部署 AJ-Report 启动的注意事项
AJ-Report 入门参考: AJ-Report 初学(入门教程) gitee 下载:https://gitee.com/anji-plus/report/releases 根据上面提供的 gitee 下载链接,点击直接下载 最上面的就是最新版本的,旧版本往下拉就可以找到,有三个下载…...
C# 生成二维码隐藏ASCII码
在 C# 中生成二维码时,如果需要隐藏或过滤掉 ASCII 码中的控制字符或不可见字符,可以在生成二维码之前对输入文本进行处理。以下是完整的实现步骤和代码示例: 1. 过滤 ASCII 码中的控制字符 ASCII 码中,0 到 31 以及 127 是控制字…...
python有没有不同精度的整型类型?
在 Python 中,不像 C、Java 等语言有明确的不同精度整型类型(如 int8、int16、int32、int64 等),Python 提供了统一的整数类型 int,它可以处理任意大小的整数,没有固定的精度限制。不过,Python …...
Python多线程编程理解面试题解析
一、多线程介绍 Python 的多线程是一种实现并发编程的方式,允许程序同时执行多个任务。然而,由于 Python 的全局解释器锁(GIL)的存在,多线程在某些场景下可能无法充分利用多核 CPU 的性能。以下是对 Python 多线程的理…...
网络协议相关知识有哪些?
前言 网络协议的基础是OSI和TCP/IP模型,这两个模型是理解协议分层的关键。 正文(仅是个人理解,如有遗漏望海涵) 网络协议是网络中设备间通信的规则和标准,涉及数据传输、路由、错误控制等多个方面。以下是网络协议相关知识的系统梳理: 一、网络协议分层模型 1、OSI七…...
【并发压测】高并发下Linux流量监控
在高并发环境下,Linux流量监控至关重要,可以帮助您确保网络性能和稳定性。以下是一些常用的Linux流量监控工具和方法: 1. **iftop**:iftop 是一款实时的网络流量监控工具,可以显示当前服务器上每个网络接口的流量使用情…...
Spring Boot项目中解决跨域问题(四种方式)
目录 一,跨域产生的原因二,什么情况下算跨域三,实际演示四,解决跨域的方法 1,CrossOrigin注解2,添加全局过滤器3,实现WebMvcConfigurer4,Nginx解决跨域5,注意 开发项目…...
革新之力:数字科技——重塑未来的超越想象之旅
在21世纪的科技浪潮中,数字科技如同一股不可阻挡的洪流,正以前所未有的速度和广度改变着我们的生活、工作乃至整个社会的结构。它不仅是技术的简单迭代,更是对人类社会认知边界的拓宽,对经济模式、社会治理、文化形态等多方面的深…...
matlab和java混合编程经验分享
最常用的就是可以查到再控制栏deploytool选择library complier打包,但是有问题就是比如果用了外部的求解器比如yalmip或者cplex的话用这个方法会找不到外部的求解器,网上找了很多,基本都大同小异。 后面分享一个亲测有效的打包方法࿰…...
rk3588/3576板端编译程序无法运行视频推理
图片推理可以,但是视频不行,运行视频推理报错:segment fault. 我遇到的问题原因是ffmpeg安装有问题,可以先在板端运行:ffmpeg -version ffmpeg version 4.2.4-1ubuntu1.0firefly6 Copyright (c) 2000-2020 the FFmpe…...
MATLAB在数据分析和绘图中的应用:从基础到实践
引言 股票数据分析是金融领域中的重要研究方向,通过对历史价格、成交量等数据的分析,可以帮助投资者更好地理解市场趋势和做出决策。MATLAB作为一种强大的科学计算工具,提供了丰富的数据处理和可视化功能,非常适合用于股票数据的…...
【CS285】高斯策略对数概率公式的学习笔记
公式介绍 在【CS285】中提到了高斯策略对数概率公式的公式如下: log π θ ( a t ∣ s t ) − 1 2 ∥ f ( s t ) − a t ∥ Σ 2 const \log \pi_{\theta}(\mathbf{a}_t | \mathbf{s}_t) -\frac{1}{2} \left\| f(\mathbf{s}_t) - \mathbf{a}_t \right\|_{\S…...
windows环境下用docker搭建php开发环境dnmp
安装WSL WSL即Linux子系统,比虚拟机占用资源少,安装的前提是系统必须是win10以上。 WSL的安装比较简单,网上有很多教程,例如:WSL简介与安装流程(Windows 下的 Linux 子系统)_wsl安装-CSDN博客&…...
区块链中的递归长度前缀(RLP)序列化详解
文章目录 1. 什么是RLP序列化?2. RLP的设计目标与优势3. RLP处理的数据类型4. RLP编码规则详解字符串的编码规则列表的编码规则 5. RLP解码原理6. RLP在以太坊中的应用场景7. 编码示例分析8. 总结 1. 什么是RLP序列化? 递归长度前缀(RLP&…...
PHP建立MySQL持久化连接(长连接)及mysql与mysqli扩展的区别
如果在 PHP 5.3 的版本以前想要创建MySQL的持久化连接(长连接),需要显式调用 pconnect 创建: $con mysql_pconnect($server[host], $server[username], $server[password]); if (!($con false)) { if (mysql_select_db($server[database], $con) fals…...
基于Python+Django+Vue的旅游景区推荐系统系统设计与实现源代码+数据库+使用说明
运行截图 功能介绍 前台功能包括:首页、详情页、订单、用户中心。后台功能包括:首页、轮播图管理、管理员、卖家管理、买家管理、景区管理、订单管理非开源功能(分类管理,地区管理,收藏管理,评论管理&a…...
架构学习第七周--Prometheus
目录 一、监控系统基础 二、Prometheus介绍 三、Prometheus单机部署 四、服务发现与告警功能 4.1,服务发现 4.2,告警功能实现 五、Prometheus与Kubernetes 5.1,Kubernetes指标 5.2,Prometheus集群部署 一、监控系统基础…...
基于Nanopi duo2的WiFi智能摄像头
1.固件包烧录 https://wiki.friendlyelec.com/wiki/index.php/NanoPi_Duo2/zh#.E8.BF.9E.E6.8E.A5WiFi 固件包链接以及烧录工具都在上面链接中 烧录过程 使用读卡器将SD卡插入到电脑,然后打开烧录工具 2.通过串口工具连接板子使其连接WiFi 对应的串口工具,就是这个HyperT…...
Hive Orc表数据导出和导入
导出到hdfs:hive执行 INSERT OVERWRITE DIRECTORY /test/hdfs_dir ROW FORMAT DELIMITED FIELDS TERMINATED BY \t STORED AS ORC SELECT * FROM hive_table; HDFS导出到本地:shell执行 hdfs dfs -get /test/hdfs_dis/file_name /linux_dir/xxx 本…...
Python爬虫实战:从零到一构建数据采集系统
文章目录 前言一、准备工作1.1 环境配置1.2 选择目标网站 二、爬虫实现步骤2.1 获取网页内容2.2 解析HTML2.3 数据保存 三、完整代码示例四、优化与扩展4.1 反爬应对策略4.2 动态页面处理4.3 数据可视化扩展 五、注意事项六、总结互动环节 前言 在大数据时代,数据采…...
Ubuntu 的RabbitMQ安装
目录 1.安装Erlang 查看erlang版本 退出命令 2. 安装 RabbitMQ 3.确认安装结果 4.安装RabbitMQ管理界面 5.启动服务并访问 1.启动服务 2.查看服务状态 3.通过IP:port 访问界面 4.添加管理员用户 a)添加用户名:admin,密码࿱…...
七星棋牌源码高阶技术指南:6端互通、200+子游戏玩法深度剖析与企业级搭建实战(完全开源)
在棋牌游戏行业高速发展的今天,如何构建一个具备高并发、强稳定性与多功能支持的棋牌游戏系统成为众多开发者和运营团队关注的焦点。七星棋牌全开源修复版源码 凭借其 六端互通、200子游戏玩法、多省区本地化支持,以及 乐豆系统、防沉迷、比赛场、AI智能…...
cuda安装
cuda WSL2急速搭建CUDA体验环境_wsl2 cuda-CSDN博客 cudnn cuDNN Archive | NVIDIA Developer pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_os_init 函数
ngx_os_init 声明在 src/os/unix/ngx_os.h ngx_int_t ngx_os_init(ngx_log_t *log); 定义在 src\os\unix\ngx_posix_init.c ngx_int_t ngx_os_init(ngx_log_t *log) {ngx_time_t *tp;ngx_uint_t n; #if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)long size; #endif#if (NGX…...
记录一次部署PC端网址全过程
当我查看我之前写的文章时、顿时惊奇发出感慨:啥时候写的?是我写的么?疑惑重重… 所以说,好记性不如烂笔头。 记录一次部署PC端网址全过程 部署PC端网址分是三步:第一步:申请域名并映射到外网IP ࿰…...
QML 实现一个动态的启动界面
QML 实现一个动态的启动界面 一、效果查看二、源码分享三、所用到的资源下载 一、效果查看 二、源码分享 工程结构 main.qml import QtQuick import QtQuick.Controls import QtQuick.Dialogs import Qt.labs.platformWindow {id:windowwidth: 640height: 400visible: truetit…...
视频HDR技术详解,你的电脑怎么播放HDR视频?
闲聊:前两天在b站上面看到影视飓风的视频,让我有点疑惑,我不知道为什么播放视频有设备撑不住一说,所以感兴趣去ytb下载了4k原片30hz刷新的,然后测试一下我的电脑能不能播放,发现还是可以的,视觉…...
Spring统一功能处理:拦截器、响应与异常的统一管理
目录 一.拦截器 二.统一数据返回格式 三.统一异常处理 一.拦截器 拦截器是Spring框架提供的核功能之,主要来拦截的请求,在指定法前后,根据业务需要执预先设定的代码。 也就是说,允许开发员提前预定义些逻辑,在的请…...
2025年度福建省职业院校技能大赛高职组“信息安全管理与评估”赛项规程
2025 年度福建省职业院校技能大赛 高 职组“ 信息安全管理与评估 ”赛项规程 一、赛项名称 省赛编号:GZ032 赛项名称:信息安全管理与评估 赛项组别:高职组 竞赛形式: 团体赛 二、竞赛目的 为全面贯彻落实国家网络强国战略&#x…...
Vue 中 nextTick 的原理详解
1. 为什么需要 nextTick Vue 采用 异步渲染机制,当响应式数据发生变化时,Vue 并不会立即更新 DOM,而是将这些变化放入一个 队列 中,并在 同一事件循环(Event Loop)中合并相同的修改,最后执行批…...
vue 手写分页
【先看效果】 (1)内容小于2页 不展示页码 (2)1 < 内容页数< 限定展示页码 展示:页码、上下页;隐藏:首页、末页图标,上、下一区间码。即:(页数&#…...
跟着柳叶刀数字健康,学习如何通过病理切片预测分子分类对预后的影响|项目复现
小罗碎碎念 项目复现 今天和大家分享一个非常具有参考价值的项目,手把手带着大家复现一篇发表在柳叶刀数字健康的文章。 花了六个小时才完成的这篇推送,信息量非常大,遇到了很多报错问题,但是解决以后的感觉是非常爽的,先给大家展示一下最终的成果——在同一张切片上,通…...
DuodooBMS源码解读之 sale_change模块
销售变更模块用户使用手册 一、模块概述 本扩展模块主要包含两个主要的 Python 文件:sale_change/report/sale_change_report.py 和 sale_change/wizard/sale_change_download.py,提供了销售变更报表查看和销售变更单下载的功能。以下是详细的使用说明…...
基于 Highcharts 实现 Vue 中的答题统计柱状图组件
在现代 Web 开发中,数据可视化是一个重要的组成部分,而 Highcharts 是一个广泛使用的 JavaScript 图表库,可以帮助开发者在 Web 页面上轻松地绘制丰富的图表。在本文中,我们将基于 Highcharts 创建一个用于答题统计的柱状图&#…...
MySQL 插入更新语句(insert…on duplicate key update语句 )
我们日常在使用 insert into 语句向表中插入数据时,一定遇到过主键或唯一索引冲突的情况,当遇到这种情况时,MySQL默认的反应是报错并停止执行后续的语句,为了避免这种情况,你有3种选择: 使用insert ignore…...
Jenkins整合Jmeter实现接口自动化测试
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、安装jmeter 下载:http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本,启动前修改j…...
基于LM Arena 的 LLM 基准测试排行榜:DeepSeek-R1 排名第 5
打开 Arena 网站:https://lmarena.ai/,点开 Leaderboard 可以看到上图的排行榜,可以看到 DeepSeek-R1 排名第 5。...
游戏引擎学习第116天
回顾昨天的工作 本次工作内容主要集中在游戏开发的低级编程优化,尤其是手动优化软件渲染。工作目的之一是鼓励开发者避免依赖外部库,而是深入理解代码并进行优化。当前阶段正进行SIMD(单指令多数据)优化,使用Intel推荐…...
【AI绘画】大卫• 霍克尼风格——自然的魔法(一丹一世界)
大卫• 霍克尼,很喜欢这个老头,“艺术是一场战斗”。老先生零九年有了iphone,开始用iphone画画,一零年开始用ipad画画,用指头划拉,据说五分钟就能画一幅,每天早上随手画几幅送给身边的朋友。很c…...
当湖南家具遇上DeepSeek:极满家开启智能家居新时代
在湖南的街头巷尾,总流传着这样一句话:家具有温度,生活才有味道。走进铂乐极满家的展厅,只有被阳光浸润的原木香气,和智能家居跳动的温暖建议。DeepSeek就推荐了能自动调节高度的智能款,连护眼灯角度都算好…...
#渗透测试#批量漏洞挖掘#畅捷通T+远程命令执行漏洞
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概况 二、攻击特征 三、应急处置…...
Docker挂载数据显式挂载和隐式挂载的区别
项目使用的Docker file 创建数据卷挂载点,结果发现宿主机目录中的数据卷路径下是空的,才知道docker file中创建的数据卷是隐式挂载,并不会在宿主机上留下持久化数据,随着容器被删除隐式挂载的数据卷也会跟着被删除 后面改为在jen…...
深度解析应用层协议-----HTTP与MQTT(涵盖Paho库)
HTTP协议概述 1.1 HTTP的基本概念 HTTP是一种应用层协议,使用TCP作为传输层协议,默认端口是80,基于请求和响应的方式,即客户端发起请求,服务器响应请求并返回数据(HTML,JSON)。在H…...
MySQL八股学习笔记
文章目录 一、MySQL结构1.宏观结构1.1.Server层1.2.存储引擎层 2.建立链接-连接器3.查询缓存4.解析SQL-解析器(1)词法分析(2)语法分析 5.执行SQL5.1.预处理器 prepare5.2.优化器 optimize5.3.执行器 execute(1…...
C++ 设计模式-备忘录模式
游戏存档实现,包括撤销/重做、持久化存储、版本控制和内存管理 #include <iostream> #include <memory> #include <deque> #include <stack> #include <chrono> #include <fstream> #include <sstream> #include <ct…...
Jenkins 环境搭建---基于 Docker
前期准备 提前安装jdk、maven、nodeJs(如果需要的话) 创建 jenkins 环境目录,用来当做挂载卷 /data/jenkins/ 一:拉取 Jenkins 镜像 docker pull jenkins/jenkins:lts 二:设置 Jenkins挂载目录 mkdir -p ~/jen…...
【动态规划篇】:解析背包问题--动态规划塑造的算法利器
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:动态规划篇–CSDN博客 文章目录 一.01背包问题1.模板题2.例题1.分割等和子集2.目标和3.最后…...
ok113i平台——多媒体播放器适配
1. 视频播放支持 1.1 在Linux平台交叉编译ffmpeg动态库,详情查看《ok113i平台——交叉编译音视频动态库》 提取如下动态库: libavcodec.so.58.134.100 libavdevice.so.58.13.100 libavfilter.so.7.110.100 libavformat.so.58.76.100 libavutil.so.56.…...
【保姆级教程】DeepSeek R1+RAG,基于开源三件套10分钟构建本地AI知识库
一、总体方案 目前在使用 DeepSeek 在线环境时,页面经常显示“服务器繁忙,请稍后再试”,以 DeepSeek R1 现在的火爆程度,这个状况可能还会持续一段时间,所以这里给大家提供了 DeepSeek R1 RAG 的本地部署方案。最后实现…...