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

【Linux】基于UDP/TCP套接字编程与守护进程

目录

一、网路套接字编程

(一)基础概念

1、源IP地址与目的IP地址

2、端口号

3、TCP与UDP

4、网络字节序

(二)套接字编程接口

1、socket 常见API

2、sockaddr结构

(三)UDP套接字

1、UDP服务器创建流程

2、UDP客户端创建流程

3、创建 socket 套接字

4、绑定 socket 端口号

5、服务器客户端数据的发送与接收

(四)TCP套接字

1、TCP服务器创建流程

2、TCP客户端创建流程

3、创建 socket 套接字

4、绑定 socketI P地址与端口号

5、服务器设置监听状态

6、服务器获取客户端连接请求

7、客户端连接请求

二、守护进程

(一)概念

(二)函数接口

(三)模拟实现


一、网路套接字编程

(一)基础概念

1、源IP地址与目的IP地址

        在网络中,IP地址就是用来标识处于网络中的一台主机的地址,而源IP地址就是发送主机的地址,而目的IP地址就是接收主机的IP地址。

2、端口号

        在网路通信中,仅仅知道主机的地址是不够的。例如:当我们打开QQ并发送一条消息时,当接收主机收到该数据时是无法确定该数据是发给QQ的还是微信的。因此在网路通信中还需要 端口号

        端口号是传输层协议的内容。

  • 端口号是一个2字节16位的整数;
  • 端口号用于标识一台主机上的进程,在网络通信中,通过端口可以得知该数据一个交给哪一个进程;
  • IP地址 + 端口号 能够标识网络上的某一台主机的某一个进程;
  • 一个端口号只能被一个进程占用,但一个进程可以占用多个端口号。

        网络通信的本质实际时进程间通信,那为什么不直接使用进程 PID 来代替端口号呢?

        (1)使网络通信与操作系统解耦;

        (2)我们知道进程 PID 是由操作系统给出的,当服务器重启后其PID很可能会发生改变,如果直接使用 PID 作为标识不便于网络通信。

        因此在网络通信中,不仅有源IP地址和目的IP地址,还有源端口号和目的端口号。除此之外,操作系统内部维护了一张哈希表,用于映射端口号到进程PCB的地址。

3、TCP与UDP

       TCP( 传输控制协议):

  • 传输层协议
  • 有链接
  • 可靠传输
  • 面向字节流

        UDP(用户数据报协议):

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报

4、网络字节序

        内存中的很多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分。

  • TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节
  • 如果发送主机是小端字节序,需先将数据转换为大端后发送;如果发送主机是大端字节序,则直接进行发送即可;但在实际编程时考虑到代码移植性,无论大端机还是小段机,向网络发送数据还是从网络接收数据统一进行转换;
  • 发送主机和接收主机都按照低地址到高地址发送接收数据

        考虑到网络字节序的问题,C语言为我们提供了库函数。

#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);

        以上便是字节序转换函数,例如 htons() 表示将16位短整数从主机字节序转换到网络字节序,至于具体是否需要进行转换由函数内部决定。

        同样对于IP地址也需要进行转换。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
//将点分十进制字符串转换为 uint32_t 的网络字节序
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
//将32位的IPv4地址转化为点分十进制字符串
char *inet_ntoa(struct in_addr in);
struct in_addr inet_makeaddr(int net, int host);
in_addr_t inet_lnaof(struct in_addr in);
in_addr_t inet_netof(struct in_addr in);

(二)套接字编程接口

1、socket 常见API

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器) 
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

2、sockaddr结构

        socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6等,各种网络协议的地址格式并不相同。

        在使用socket API时,无论是网络套接字还是域间套接字都需要强转为 struct sockaddr 类型,通过传入参数 socketaddr 的前16位操作系统可以分辨是哪种套接字,从而在内部切换对应的套接字结构。

//sockaddr 结构
/* Structure describing a generic socket address.  */
struct sockaddr{__SOCKADDR_COMMON (sa_);	/* Common data: address family and length.  */char sa_data[14];		/* Address data.  */};//sockaddr_in 结构
/* Structure describing an Internet socket address.  */
struct sockaddr_in{__SOCKADDR_COMMON (sin_);in_port_t sin_port;			    /* Port number.  */struct in_addr sin_addr;		/* Internet address.  *//* Pad to size of `struct sockaddr'.  */unsigned char sin_zero[sizeof (struct sockaddr) -__SOCKADDR_COMMON_SIZE -sizeof (in_port_t) -sizeof (struct in_addr)];};//in_addr结构
/* Internet address.  */
typedef uint32_t in_addr_t;
struct in_addr{in_addr_t s_addr;};

(三)UDP套接字

1、UDP服务器创建流程

1、创建套接字;

2、绑定IP地址和端口号;

3、接收数据、处理数据和发送数据。

2、UDP客户端创建流程

1、创建套接字;

2、客户端不需要显式 bind IP地址与端口号,该动作由操作系统完成;

3、发送数据、接收数据和对数据进行处理。

3、创建 socket 套接字

NAMEsocket - create an endpoint for communication
SYNOPSIS#include <sys/socket.h>int socket(int domain, int type, int protocol);
RETURN VALUEUpon  successful  completion, socket() shall return a non-negative 
integer, the socket file descriptor. Otherwise, a value of -1 shall be returned 
and errno set to indicate the error.

用途:服务器与客户端创建 socket 文件描述符(TCP/UDP)

参数

  • domain:指定套接字的协议族,常见的协议族有AF_INET(IPv4网络通信)、AF_UNIX/AF_LOCAL(本地通信)
  • type:指定套接字的类型。常见的类型有SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。
  • protocol:套接字使用的具体协议,通常与 domain和 type配合使用。一般情况下,可以将其设置为 0,表示由操作系统根据 domain和 type自动选择合适的协议。

返回值:

  • 如果成功会返回一个非负的整型值,表示套接字的文件描述符;
  • 如果失败返回-1,并设置 error 来表示错误原因。

4、绑定 socket 端口号

NAMEbind - bind a name to a socket
SYNOPSIS#include <sys/socket.h>int bind(int socket, const struct sockaddr *address,socklen_t address_len);
RETURN VALUEUpon successful completion, bind() shall return 0; otherwise, -1 shall 
be returned and errno set to indicate the error.

用途:将一个套接字与一个特定的IP地址和端口号绑定

参数:

  • socket:套接字的文件描述符;
  • address:指向 struct sockaddr 类型的指针,包含套接字将要绑定的地址信息。具体的地址结构根据协议族的不同而有所区别;
  • address_len:地址结构的长度,通常使用 sizeof 来获取。

5、服务器客户端数据的发送与接收

NAMEsendto - send a message on a socket
SYNOPSIS#include <sys/socket.h>ssize_t sendto(int socket, const void *message, size_t length,int flags, const struct sockaddr *dest_addr,socklen_t dest_len);
RETURN VALUEUpon successful completion, sendto() shall return the number of bytes 
sent. Otherwise, -1 shall be returned and errno set to indicate the error.

用途:从已连接的 socket 中发送数据,常用于通过 UDP 协议或其他支持无连接的协议发送数据。

参数:

  • socket:套接字的文件描述符;
  • message:发送数据的地址;
  • length:发送数据的长度;
  • flags:控制发送操作的标志,通常为0;
  • dest_addr:指向 sockaddr 结构体指针,包含目标地址的信息;
  • dest_len:dest_addr 的长度,以字节为单位。

返回值:

  • 成功时返回发送的字节数;
  • 失败时返回-1并设置错误码。
NAMErecvfrom - receive a message from a socket
SYNOPSIS#include <sys/socket.h>ssize_t recvfrom(int socket, void *restrict buffer, size_t length,int flags, struct sockaddr *restrict address,socklen_t *restrict address_len);
RETURN VALUEUpon successful completion, recvfrom() shall return the length of the 
message in bytes. If no messages are available to be received and the peer 
has performed an orderly shutdown,  recvfrom()  shall return 0. Otherwise, 
the function shall return -1 and set errno to indicate the error.

用途:从套接字接收数据的函数,它可以接收来自网络的消息,并允许用户指定用于接收消息的缓冲区,常用于 UDP 协议和其他无连接协议中。

参数:

  • socket:套接字的文件描述符;
  • buffer:指向内存缓冲区的指针,用于存储接收到的数据;
  • length:buffer缓冲区的大小;
  • flags:控制接收操作的标志,通常为 0;
  • address:指向 sockaddr 结构体的指针,接收端的信息由此填充;
  • address_len:指向 address 结构体的指针,表示该结构体的长度。

返回值:

  • 成功时返回接收到的字节数;
  • 若无消息接收且接收方关闭连接则返回0;
  • 失败时返回-1并设置错误码。

(四)TCP套接字

1、TCP服务器创建流程

1、创建套接字;

2、绑定IP地址和端口号;

3、设置 socket 处于监听状态;

4、等待获取客户端连接请求;

5、接收数据、处理数据和发送数据。

2、TCP客户端创建流程

1、创建套接字;

2、客户端不需要显式 bind IP地址与端口号,该动作由操作系统完成;

3、向服务器发送连接请求;

4、发送数据、接收数据和对数据进行处理。

3、创建 socket 套接字

         同UDP,但传入参数不同。

//UDP
udpFd = socket(AF_INET, SOCK_DGRAM, 0);
//TCP
tcpFd = spcket(AF_INET, SOCK_STREAM, 0);

4、绑定 socketI P地址与端口号

        同UDP,但传入参数不同。

5、服务器设置监听状态

NAMElisten - listen for socket connections and limit the queue of incoming 
connections
SYNOPSIS#include <sys/socket.h>int listen(int socket, int backlog);
RETURN VALUEUpon successful completions, listen() shall return 0; otherwise, -1 
shall be returned and errno set to indicate the error.

用途:在一个套接字上监听来自客户端的连接请求,主要用于面向连接的协议(如 TCP)。

参数:

  • socket:套接字的文件描述符;
  • blcklog:表示在套接字上等待连接的最大队列长度。

返回值:

  • 成功时返回0;
  • 失败时返回-1并设置错误码。

6、服务器获取客户端连接请求

NAMEaccept - accept a new connection on a socket
SYNOPSIS#include <sys/socket.h>int accept(int socket, struct sockaddr *restrict address,socklen_t *restrict address_len);
RETURN VALUEUpon successful completion, accept() shall return the non-negative 
file descriptor of the accepted socket. Otherwise, -1 shall be returned and 
errno set to indicate the error.

用途:在一个已监听的套接字上接受一个客户端的连接请求。

参数:

  • socket:套接字的文件描述符;
  • address:指向 sockaddr 结构体的指针,用来存储客户端的地址信息;
  • address_len:指向 socket_t 类型的指针,表示 address 缓冲区的长度。

返回值:

  • 成功时返回一个新的套接字,该文件描述符用于与用户进行数据交换;
  • 失败时返回-1并设置错误码。

7、客户端连接请求

NAMEconnect - connect a socket
SYNOPSIS#include <sys/socket.h>int connect(int socket, const struct sockaddr *address,socklen_t address_len);
RETURN VALUEUpon successful completion, connect() shall return 0; otherwise, -1 
shall be returned and errno set to indicate the error.

用途:用于客户端向服务器发起连接请求。

参数:

  • socket:套接字的文件描述符;
  • address:指向 sockaddr 结构体的指针,结构体中包含了目标主机的 IP 地址和端口号等信息
  • address_len:表示结构体 address 的长度。

返回值:

  • 成功时返回0;
  • 失败时返回-1并设置错误码。

二、守护进程

(一)概念

        当我们登录云服务器并使服务器运行时,如果我们退出登录,云服务器上部署的服务器也会被关闭,如何使得部署的服务器不受用户登录注销的影响呢?

        这时候就需要将服务器变为守护进程,守护进程的本质实际是一个孤儿进程。

        当我们登录云服务器时会建立一个会话,一个会话只有一个前台进程和n个后台进程,作业之间可以前后台转换,但这些任务仍有可能收到用户登陆注销的影响。

        而守护进程则是将目标进程独立出去成为一个新的会话,因此便不受用户的影响,可以一直运行下去。

        其中SID则为会话ID,PGID为一个进程组的ID,该ID值与进程组组长的PID相同。

(二)函数接口

        Linux生成守护进程的接口:

NAMEdaemon - run in the background
SYNOPSIS#include <unistd.h>int daemon(int nochdir, int noclose);Feature Test Macro Requirements for glibc (see feature_test_macros(7)):daemon(): _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)
RETURN VALUE(This  function  forks,  and  if the fork(2) succeeds, the parent 
calls _exit(2), so that further errors are seen by the child only.)  On 
success daemon() returns zero.  If an error occurs, daemon() returns -1 
and sets errno to any of the errors specified for the fork(2) and setsid(2).

用途:将程序放到后台运行的函数,通常在编写守护进程(daemon process)时使用。

参数:

  • nochdir:如果这个参数为非零值,表示守护进程在后台运行时不会改变当前工作目录,如果设置为 0,则守护进程会将当前工作目录更改为根目录 /,通常为了避免守护进程锁定在某个目录中,导致无法卸载该目录;
  • noclose:如果该参数为非零值,表示守护进程不会关闭标准输入、标准输出和标准错误输出文件描述符(即不调用 close())。如果设置为 0,守护进程会关闭这些文件描述符。通常,为了避免守护进程继承父进程的终端输出,会关闭这些文件描述符。

返回值:

  • 成功时返回0;
  • 失败时返回-1并设置错误码。

(三)模拟实现

        在实现之前需知道一个函数:

NAMEsetsid - create session and set process group ID
SYNOPSIS#include <unistd.h>pid_t setsid(void);
RETURN VALUEUpon successful completion, setsid() shall return the value of the 
new process group ID of the calling process.  Otherwise, it shall return 
(pid_t)-1 and set errno to indicate the error.

用途:创建一个新的会话(session)并使当前进程成为新的会话领导进程并且不会收到终端的控制。进程组的组长不能调用setsid()函数来创建一个新的会话。

参数:无

返回值:

  • 成功时返回该会话的ID
  • 失败时返回-1并设置错误码
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cassert>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;
//数据黑洞,向它写入的数据会被吃掉,读取数据什么都读不到(不会使进程退出)
#define DEV "/dev/null"
void daemonSelf(const char *currPath = nullptr)
{signal(SIGPIPE, SIG_IGN);//创建子进程 使子进程成为守护进程if (fork() > 0)exit(0);pid_t id = setsid();assert(id != -1);int fd = open(DEV, O_RDWR);if (fd >= 0){//创建成功重定向dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);}else{//创建失败手动关闭close(0);close(1);close(2);}if (currPath)chdir(currPath);
}

相关文章:

【Linux】基于UDP/TCP套接字编程与守护进程

目录 一、网路套接字编程 &#xff08;一&#xff09;基础概念 1、源IP地址与目的IP地址 2、端口号 3、TCP与UDP 4、网络字节序 &#xff08;二&#xff09;套接字编程接口 1、socket 常见API 2、sockaddr结构 &#xff08;三&#xff09;UDP套接字 1、UDP服务器创建…...

Linux CentOS 上 Ollama 的安装与部署:从入门到实践

Linux CentOS 上 Ollama 的安装与部署:从入门到实践 随着人工智能技术的快速发展,大语言模型(LLMs)的应用场景越来越广泛。Ollama 作为一个轻量级的 AI 模型管理工具,为开发者提供了便捷的模型部署和管理解决方案。本文将详细介绍如何在 Linux CentOS 系统上安装和部署 O…...

大数据学习之任务流调度系统Azkaban、Superset可视化系统

一.任务流调度系统Azkaban 1.课程介绍 2.为什么需要工作流调度系统 3.AZKABAN是什么 4.AZKABAN下载 5.制作安装包 6.tar包准备 7.MYSQL配置AZKABAN 8.配置EXECUTOR SERVER 9.配置WEBSERVER 10.单作业实战_yaml语言(今天稍晚更新) 11.单作业实战 12.多作业依赖实战 13.失败自动重…...

网络空间安全(2)应用程序安全

前言 应用程序安全&#xff08;Application Security&#xff0c;简称AppSec&#xff09;是一个综合性的概念&#xff0c;它涵盖了应用程序从开发到部署&#xff0c;再到后续维护的整个过程中的安全措施。 一、定义与重要性 定义&#xff1a;应用程序安全是指识别和修复应用程序…...

UDP、TCP的区别

UDP&#xff08;用户数据报协议&#xff09;和TCP&#xff08;传输控制协议&#xff09;是两种常用的传输层协议&#xff0c;它们在数据传输方式、可靠性和应用场景等方面有显著区别。以下是它们的主要区别&#xff1a; ### 1. 连接方式 - **TCP**&#xff1a;面向连接。通信前…...

Linux 第二次脚本作业

1、需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 2、设计一个 Shell 程序&#xff0c;在/userdata 目录下建立50个目录&#xff0c;即 user1~user50&#xff0c;并设置每个目录的权限&#xff0c;其中其他用户的权…...

高清下载油管视频到本地

下载工具并安装: yt-dlp官网地址&#xff1a; GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader ffmpeg官网地址&#xff1a; Download FFmpeg 注&#xff1a;记住为其添加环境变量 操作命令&#xff1a; 该指令表示以720p码率下载VIDEO_UR…...

Linux 命令大全完整版(07)

2. linux 系统设置命令 ulimit 功能说明&#xff1a;控制 shell 程序的资源。语法&#xff1a;ulimit [-aHS][-c <core 文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小…...

基于CentOS7安装kubesphere和Kubernetes并接入外部ES收集日志

一、修改所有节点主机名 主节点就修改成master hostnamectl set-hostname master 然后输入bash刷新当前主机名 工作节点1就修改成node1 hostnamectl set-hostname node1 然后输入bash刷新当前主机名 二、全部节点安装依赖并同步时间 yum -y install socat conntrack ebta…...

Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用

功能预览 一、工具简介 PDF 分割工具支持以下核心功能: 拖放或上传 PDF 文件:用户可以通过拖放或点击上传 PDF 文件。两种分割模式: 指定范围:用户可以指定起始页和结束页,提取特定范围的内容。固定间距:用户可以设置间隔页数(例如每 5 页分割一次),工具会自动完成分…...

高速差分信号的布线

差分信号如何在PCB上布线&#xff1f; 1.差分信号必须保证线间距相等&#xff0c;禁止打过孔或者放置元器件 2.差分信号必须打孔时&#xff0c;必须要保证伴随屏蔽地过孔&#xff08;缝合定位孔&#xff09;&#xff0c;减少信号干扰问题。 3.差分信号走线弯曲位置推荐&#…...

用openresty和lua实现壁纸投票功能

背景 之前做了一个随机壁纸接口&#xff0c;但是不知道大家喜欢对壁纸的喜好&#xff0c;所以干脆在实现一个投票功能&#xff0c;让用户给自己喜欢的壁纸进行投票。 原理说明 1.当访问http://demo.com/vote/时&#xff0c;会从/home/jobs/webs/imgs及子目录下获取图片列表&…...

智能测试执行 利用算法 利用图像识别、自然语言处理等技术实现自动化测试执行

以下将从Web应用和移动应用两个方面,给出利用图像识别、自然语言处理等技术实现自动化测试执行的实例,并附上部分代码示例。 Web应用自动化测试实例:模拟用户登录操作测试 需求理解 对于一个Web应用的登录功能进行自动化测试,我们可以结合自然语言处理理解测试用例描述,…...

AI学习之-阿里天池

阿里天池&#xff08;Tianchi&#xff09;是阿里巴巴集团旗下的一个数据科学与人工智能竞赛平台&#xff0c;致力于推动数据科学和人工智能的发展。在天池平台上&#xff0c;人们可以参与各种数据竞赛和挑战&#xff0c;解决实际问题&#xff0c;提升数据科学技能。天池平台提供…...

AGI觉醒假说的科学反驳:从数学根基到现实约束的深度解析

文章目录 引言:AGI觉醒论的核心迷思一、信息论视角:意识产生的熵约束1.1 香农熵的物理极限1.2 量子退相干的时间屏障二、数学根基:形式系统的自指困境2.1 哥德尔不完备定理的现代诠释三、概念解构:AGI觉醒假说的认知陷阱3.1 术语混淆的迷雾3.2 拟人化谬误的认知根源四、意识…...

SpringMVC的基本使用

controller标记一个类是控制器类 RequestMapping 进行路由映射可以是类也可以是方法&#xff0c;路由的/可以不加&#xff0c;但建议加上 1&#xff09;简单的映射返回一个hello RequestMapping("/m1")public String m1() { return "hello";} 2&#x…...

【漫话机器学习系列】103.学习曲线(Learning Curve)

学习曲线&#xff08;Learning Curve&#xff09;详解 1. 什么是学习曲线&#xff1f; 学习曲线&#xff08;Learning Curve&#xff09;是机器学习和深度学习领域中用于评估模型性能随训练过程变化的图示。它通常用于分析模型的学习能力、是否存在过拟合或欠拟合等问题。 从…...

ubuntu-24.04.1-desktop 中安装 QT6.7

ubuntu-24.04.1-desktop 中安装 QT6.7 1 环境准备1.1 安装 GCC 和必要的开发包:1.2 Xshell 连接 Ubuntu2 安装 Qt 和 Qt Creator:2.1 下载在线安装器2.2 在虚拟机中为文件添加可执行权限2.3 配置镜像地址运行安装器2.4 错误:libxcb-xinerama.so.0: cannot open shared objec…...

MQTT实现智能家居------2、写MQTT程序的思路

举个最简单的例子&#xff1a; 手机------服务器-------家具 我们这里只看手机和家具的客户端&#xff1a; 手机&#xff1a;1&#xff09;需要连接服务器 2&#xff09;需要发布指令给服务器到家里的家具 3&#xff09;接受来自于家里家具的异常状况 4&#xff09;保持心…...

【个人开发】deepspeed+Llama-factory 本地数据多卡Lora微调【完整教程】

文章目录 1.背景2.微调方式2.1 关键环境版本信息2.2 步骤2.2.1 下载llama-factory2.2.2 准备数据集2.2.3 微调模式2.2.3.1 zero-1微调2.2.3.2 zero-2微调2.2.3.3 zero-3微调2.2.3.4 单卡Lora微调 2.2.4 实验2.2.4.1 实验1&#xff1a;多GPU微调-zero12.2.4.2 实验2&#xff1a;…...

DeepSeek 从入门到精通:全面掌握 DeepSeek 的核心功能与应用

引言 DeepSeek 是一款功能强大的工具&#xff08;或平台/框架&#xff0c;具体根据实际定义&#xff09;&#xff0c;广泛应用于数据分析、人工智能、自动化任务等领域。无论你是初学者还是资深开发者&#xff0c;掌握 DeepSeek 的核心功能和应用场景都将为你的工作和学习带来…...

“国补”带火手机换新,出售旧手机应如何保护个人信息安全

在“国补”政策的推动下,手机换新热潮正席卷而来。“国补”以其诱人的补贴力度,成功激发了消费者更换手机的热情。无论是渴望体验最新技术的科技爱好者,还是对旧手机性能不满的普通用户,都纷纷投身到这场手机换新的浪潮之中。 随着大量消费者参与手机换新,二手手机市场迎来…...

驱动开发系列39 - Linux Graphics 3D 绘制流程(二)- 设置渲染管线

一:概述 Intel 的 Iris 驱动是 Mesa 中的 Gallium 驱动,主要用于 Intel Gen8+ GPU(Broadwell 及更新架构)。它负责与 i915 内核 DRM 驱动交互,并通过 Vulkan(ANV)、OpenGL(Iris Gallium)、或 OpenCL(Clover)来提供 3D 加速。在 Iris 驱动中,GPU Pipeline 设置 涉及…...

Windows使用docker部署fastgpt出现的一些问题

文章目录 Windows使用docker部署FastGPT出现的一些问题1.docker部署pg一直重启的问题2.重启MongoDB之后一直出现“Waiting for MongoDB to start...”3.oneapi启动不了failed to get gpt-3.5-turbo token encoder Windows使用docker部署FastGPT出现的一些问题 1.docker部署pg一…...

六十天前端强化训练之第一天HTML5语义化标签深度解析与博客搭建实战

欢迎来到编程星辰海的博客讲解 目录 一、语义化标签的核心价值 1.1 什么是语义化&#xff1f; 1.2 核心优势 二、语义标签详解与使用场景 2.1 布局容器标签 2.2 内容组织标签 三、博客结构搭建实战 3.1 完整HTML结构 3.2 核心结构解析 3.3 实现效果说明 四、学习要点…...

Oracle中补全时间的处理

在实际数据处理的过程中&#xff0c;存在日期不连续的问题&#xff0c;可能会导致数据传到前后端出现异常&#xff0c;为了避免这种问题&#xff0c;通常会从数据端进行日期不全的处理&#xff1a; 以下为补全年份的案例&#xff1a; with x as (select 开始年份 &#xff08;…...

PHP课程预约小程序源码

&#x1f4f1; 课程预约小程序&#xff1a;为您专属定制的便捷预约新体验 在这个快节奏的时代&#xff0c;我们深知每一位瑜伽爱好者、普拉提追随者以及培训机构管理者对高效、便捷服务的迫切需求。因此&#xff0c;我们匠心独运&#xff0c;推出了一款基于PHPUniApp框架开发的…...

(200): error: #29: expected an expression error: #40: expected an identifier

这是因为你乱加define导致你的define与变量名重复就会出现&#xff0c;他找不到错误只会抱着两个错...

一文讲解Redis中的常用命令

①、操作字符串的命令有&#xff1a; SET key value&#xff1a;设置键 key 的值为 value。GET key&#xff1a;获取键 key 的值。DEL key&#xff1a;删除键 key。INCR key&#xff1a;将键 key 存储的数值增一。DECR key&#xff1a;将键 key 存储的数值减一。 ②、操作列表…...

智能交通系统(Intelligent Transportation Systems):智慧城市中的交通革新

智能交通系统&#xff08;Intelligent Transportation Systems, ITS&#xff09;是利用先进的信息技术、通信技术、传感技术、计算机技术以及自动化技术等&#xff0c;来提升交通系统效率和安全性的一种交通管理方式。ITS通过收集和分析交通数据&#xff0c;智能化地调度、控制…...

Node.js 登录鉴权

目录 Session express-session 配置 express-session 函数 ts 要配置声明文件 express-session.d.ts express-session 使用 express-session 带角色 Token 什么是 JWT token jsonwebtoken 使用 jsonwebtoken 带角色 Session express 使用 express-session 管理会话&…...

EPSON L3118彩色喷墨打印机灯全闪故障维修一例

一台EPSON L3118彩色喷墨打印机&#xff0c;故障时开机灯全闪烁&#xff0c;一般来说这种故障问题都不太大&#xff0c;要么就是打印机内部卡纸了&#xff0c;要么就是传感器故障&#xff0c;一般情况下卡纸的问题比较多… …&#xff1b; 但是遇到一用户又菜又爱玩&#xff0c…...

在 Mac ARM 架构的 macOS 系统上启用 F1 键作为 Snipaste 的截屏快捷键

在 Mac ARM 架构的 macOS 系统上启用 F1 键作为 Snipaste 的截屏快捷键&#xff0c;主要涉及到两个方面&#xff1a;确保 F1 键作为标准功能键工作 和 在 Snipaste 中设置 F1 为快捷键。 因为 Mac 默认情况下&#xff0c;F1-F12 键通常用作控制屏幕亮度、音量等系统功能的快捷键…...

基于AT89C51单片机的教室智能照明控制系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/90419908?spm1001.2014.3001.5501 C16 部分参考设计如下&#xff1a; 摘 要 本项目的智能教室灯光控制系统通过合理的软硬件设计&#xff0c;有效地提升了教室…...

JavaSE学习笔记25-反射(reflection)

反射 在Java中&#xff0c;反射&#xff08;Reflection&#xff09; 是一种强大的机制&#xff0c;允许程序在运行时检查和操作类、方法、字段等信息。通过反射&#xff0c;可以动态地创建对象、调用方法、访问字段&#xff0c;甚至修改私有成员。反射的核心类是 java.lang.re…...

ctf网络安全题库 ctf网络安全大赛答案

此题解仅为部分题解&#xff0c;包括&#xff1a; 【RE】&#xff1a;①Reverse_Checkin ②SimplePE ③EzGame 【Web】①f12 ②ezrunner 【Crypto】①MD5 ②password ③看我回旋踢 ④摩丝 【Misc】①爆爆爆爆 ②凯撒大帝的三个秘密 ③你才是职业选手 一、 Re ① Reverse Chec…...

旋转位置编码(ROPE)详解:从Transformer到现代前沿

旋转位置编码&#xff08;ROPE&#xff09;详解&#xff1a;从Transformer到现代前沿 标签&#xff1a;NLP, Transformer, 位置编码, ROPE, 深度学习, 机器学习 摘要&#xff1a;本文详细介绍了旋转位置编码&#xff08;ROPE&#xff09;在Transformer模型中的应用&#xff0…...

ROS2机器人开发--服务通信与参数通信

服务通信与参数通信 在 ROS 2 中&#xff0c;服务&#xff08;Services&#xff09;通信和参数&#xff08;Parameters&#xff09;通信是两种重要的通信机制。服务是基于请求和响应的双向通信机制。参数用于管理节点的设置&#xff0c;并且参数通信是基于服务通信实现的。 1 …...

安全运维,等保测试常见解决问题。

1. 未配置口令复杂度策略。 # 配置密码安全策略 # vi /etc/pam.d/system-auth # local_users_only 只允许本机用户。 # retry 3 最多重复尝试3次。 # minlen12 最小长度为12个字符。 # dcredit-1 至少需要1个数字字符。 # ucredit-1 至少需要1个大…...

【数据标准】数据标准化是数据治理的基础

导读&#xff1a;数据标准化是数据治理的基石&#xff0c;它通过统一数据格式、编码、命名与语义等&#xff0c;全方位提升数据质量&#xff0c;确保准确性、完整性与一致性&#xff0c;从源头上杜绝错误与冲突。这不仅打破部门及系统间的数据壁垒&#xff0c;极大促进数据共享…...

Java 18~20 新特性

文章目录 一、Java 18 新特性1.1、UTF-8 作为默认字符集&#xff08;JEP 400&#xff09;1.2、简易 Web 服务器&#xff08;JEP 408&#xff09;1.3、代码片段标签 snippet&#xff08;JEP 413&#xff09;1.4、使用方法句柄重新实现反射核心&#xff08;JEP 416&#xff09;1.…...

程序员学商务英语之At the Hotel

Dialogue-3 Room service-Cleaning the Room客房服务-打扫房间 A: Who will do the dishes after dinner tonight? 今晚饭后谁来洗碗&#xff1f; B: It’s your turn. 轮到你了。 Go do the room right now. clean the room去打扫房间。Doing the laundry is the last thi…...

探秘路由表:网络世界的导航地图

一、引言 在当今数字化时代&#xff0c;网络已经成为我们生活中不可或缺的一部分。无论是浏览网页、观看视频&#xff0c;还是进行在线办公、游戏娱乐&#xff0c;我们都在与网络进行着频繁的交互。而在这背后&#xff0c;网络中的数据传输就如同现实生活中的快递配送&#xf…...

UniApp SelectorQuery 讲解

一、SelectorQuery简介 在UniApp中&#xff0c;SelectorQuery是一个非常强大的工具&#xff0c;它允许开发者查询节点信息。通过这个API&#xff0c;我们可以获取到页面元素的尺寸、位置、滚动条位置等信息。这在处理动态布局、动画效果或是用户交互时尤为重要。 二、基本使用…...

三数之和:经典问题的多种优化策略

三数之和&#xff1a;经典问题的多种优化策略 大家好&#xff0c;我是Echo_Wish。今天我们来聊一个经典的算法问题——三数之和&#xff08;3Sum&#xff09;。它是许多面试和算法竞赛中常见的问题之一&#xff0c;也常常考察我们对算法优化的理解和技巧。我们不仅要解决问题&…...

Flash-00

下载网站&#xff1a;Flash CC 2015中文版下载-Adobe Flash CC 2015(动画制作软件)免费下载-当快软件园 1-什么是Flash&#xff1f; Flash是一款多媒体设计软件&#xff0c;二维交互式动画设计工具&#xff0c;常用于矢量动画制作 2-Flash的应用领域&#xff1f; 动画制作&a…...

FTP 实验(ENSP模拟器实现)

FTP 概述 FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型&#xff0c;客户端通过FTP客户端软件&#xff0c;连接到FTP服务…...

DeepSeek在初创企业、教育和数字营销领域应用思考

如今&#xff0c;像 DeepSeek 这样的人工智能工具正在改变企业的运营方式&#xff0c;优化流程并显著提高生产力。通过重复任务的自动化、大量数据的分析以及内容创建效率的提高&#xff0c;组织正在寻找新的竞争和卓越方式。本文介绍了 DeepSeek 如何用于提高三个关键领域的生…...

ubuntu新系统使用指南

1. 更新源 2. 配置rime 输入法 sudo apt install ibus-rimeibus-setup #打开配置界面添加雾凇拼音 cd ~/Documents/Tool/input_source/plumgit clone --depth 1 https://github.com/rime/plum plum #没有梯子就劝退cd plum/bash rime-install iDvel/rime-ice:others/recipe…...

HaProxy配置详解

一、haproxy基础配置 官方文档&#xff1a;HAProxy version 2.2.22 - Configuration Manual HAProxy 的配置文件haproxy.cfg由两大部分组成&#xff0c;分别是global和proxies部分。 global&#xff1a;全局配置段 进程及安全配置相关的参数性能调整相关参数Debug参数 pro…...