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

Linux C/C++ Socket 编程

本文目录

  • Linux C语言 socket 编程 client 端
    • 头文件 unistd.h & arpa/inet.h
      • 1. **`unistd.h`**
      • 2. **`arpa/inet.h`**
    • socket() 创建套接字
    • sockaddr_in 结构体
    • inet_pton()
    • connect()
    • send()
    • recv()
    • send() 和 recv() 中的 flags 参数
        • **默认行为(`flags = 0`)的特点:**
        • 其他 `flags` 标志:
    • close()
    • 使用 C++ 面向对象编程思想封装
  • Linux C语言 socket 编程 server 端
    • setsockopt()
    • bind()
    • listen()
    • accept()
    • read()
    • server 端 C++
  • 运行
  • Linux socket 编程在线英文文档

进行网络套接字编程之前,需要有计算机网络相关方面的知识。

Linux C语言 socket 编程 client 端

// 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 SERVER_PORT 12000       // 服务器端口int main() {// 创建套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("Socket creation failed");exit(EXIT_FAILURE);}// 设置服务器信息struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);// 将服务器的 IP 地址转换为二进制形式if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0) {perror("Invalid address or Address not supported");close(sockfd);exit(EXIT_FAILURE);}// 连接到服务器if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("Connection failed");close(sockfd);exit(EXIT_FAILURE);}// 发送数据char *message = "Hello, server!";if (send(sockfd, message, strlen(message), 0) == -1) {perror("Send failed");close(sockfd);exit(EXIT_FAILURE);}printf("Message sent to server: %s\n", message);// 接收数据char buffer[1024];int bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0);if (bytes_received == -1) {perror("Recv failed");close(sockfd);exit(EXIT_FAILURE);}buffer[bytes_received] = '\0';  // 添加字符串终止符printf("Received from server: %s\n", buffer);// 关闭套接字close(sockfd);return 0;
}

编译:gcc -o client client.c
Terminal 下运行:./client

头文件 unistd.h & arpa/inet.h

这两个头文件 unistd.harpa/inet.h 都是 POSIX 标准 下的系统头文件,广泛用于 Unix/Linux 系统上的编程,尤其是网络编程和低级系统调用。

1. unistd.h

unistd.h 是一个与 Unix 系统调用相关的头文件,提供了大量与操作系统交互的功能,例如文件操作、进程管理、内存管理、IO 操作等。

常用功能:

  • 文件操作

    • read(): 读取文件描述符中的数据。
    • write(): 向文件描述符写入数据。
    • close(): 关闭文件描述符。
  • 进程控制

    • fork(): 创建一个新进程(分叉)。
    • exec(): 替换当前进程的执行映像。
    • getpid(): 获取当前进程的 PID。
    • getppid(): 获取父进程的 PID。
  • 文件描述符操作

    • dup(), dup2(): 复制文件描述符。
    • pipe(): 创建管道。
  • 时间管理

    • sleep(): 使当前进程睡眠指定的秒数。
    • usleep(): 使当前进程睡眠指定的微秒数。
  • 系统信息

    • getcwd(): 获取当前工作目录。

这些函数大多数涉及操作系统级别的基本功能,因此它们的效率高,广泛应用于各种系统编程中。

2. arpa/inet.h

arpa/inet.h 是与 Internet 地址处理网络通信 相关的头文件,提供了对 IP 地址和端口号进行转换、网络字节序与主机字节序之间转换等功能。这些函数对于进行 网络编程,尤其是 TCP/IP 网络通信 非常重要。

常用功能:

  • IP 地址转换

    • inet_pton(): 将 IP 地址从点分十进制字符串转换为网络字节序的二进制格式(用于 struct sockaddr_in)。
    • inet_ntop(): 将网络字节序的 IP 地址转换为点分十进制字符串。
  • 主机字节序与网络字节序转换

    • htons(): 将 16 位短整数从主机字节序转换为网络字节序(例如端口号)。
    • htonl(): 将 32 位长整数从主机字节序转换为网络字节序(例如 IP 地址)。
    • ntohs(): 将 16 位短整数从网络字节序转换为主机字节序。
    • ntohl(): 将 32 位长整数从网络字节序转换为主机字节序。

这些函数通常用于 TCP/IP 套接字编程中,帮助程序处理地址、端口号的转换和网络字节序问题。

socket() 创建套接字

// 创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {perror("Socket creation failed");exit(EXIT_FAILURE);
}

在 linux 系统上,可以使用 man 命令(Linux Manual Pages (man pages))来查看大部分 Linux 系统调用的文档,man 2 socket:查看 socket() 函数的详细文档:

$ man 2 socket
-----------------------------
socket(2)                                                           System Calls Manual                                                          socket(2)NAMEsocket - create an endpoint for communicationLIBRARYStandard C library (libc, -lc)SYNOPSIS#include <sys/socket.h>int socket(int domain, int type, int protocol);DESCRIPTIONsocket()  creates an endpoint for communication and returns a file descriptor that refers to that endpoint.  The file descriptor returned by a suc‐cessful call will be the lowest-numbered file descriptor not currently open for the process.The domain argument specifies a communication domain; this selects the protocol family which will be used for communication.   These  families  aredefined in <sys/socket.h>.  The formats currently understood by the Linux kernel include:Name         Purpose                                    Man pageAF_UNIX      Local communication                        unix(7)AF_LOCAL     Synonym for AF_UNIXAF_INET      IPv4 Internet protocols                    ip(7)AF_AX25      Amateur radio AX.25 protocol               ax25(4)AF_IPX       IPX - Novell protocols
... ...
... ...
... ...

socket() 是一个系统调用,用于创建一个新的套接字。套接字是进行网络通信的基础,通过它可以实现数据的发送和接收。socket() 函数会返回一个 套接字描述符,它是一个整数值,后续的网络操作(如连接、发送、接收等)都需要通过这个描述符进行。

socket() 函数第一个参数常用的有 AF_INET (IPv4 地址族)和 AF_INET6 (IPv6 地址族)。第二个参数常用的有 SOCK_STREAM (TCP)和 SOCK_DGRAM (UDP)。第三个参数-通常指定套接字使用的协议。对于 SOCK_STREAM 类型,协议值通常设置为 0,表示使用默认协议。在 IPv4 上,默认协议就是 TCP,在 SOCK_DGRAM 类型下,默认协议是 UDP。如果使用 AF_INET6,则可以使用 IPPROTO_TCPIPPROTO_UDP 来指定具体协议。

返回值:如果成功,则返回新套接字的文件描述符。如果失败,则返回 -1,并 适当设置 errno 。

sockaddr_in 结构体

struct sockaddr_in 是一个结构体,用来表示 IPv4 地址和端口信息。它定义在 <netinet/in.h> 头文件中,通常用于套接字编程中存储 IP 地址和端口信息。

// definition
struct sockaddr_in
{short   sin_family; /* must be AF_INET */u_short sin_port;struct  in_addr sin_addr;char    sin_zero[8]; /* Not used, must be zero */
};
    // 设置服务器信息struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);

memset() 的作用是将指定的内存区域填充为特定的值。这里将 server_addr 结构体的所有字节设置为 0,这样可以确保结构体中的所有字段都初始化为 0,防止未初始化的字段造成意外行为。

  • htons() 是一个用于 字节序转换 的函数。它的作用是将 主机字节序(即本机的字节序)转换为 网络字节序(即大端字节序)。

    • 网络字节序:大端字节序(big-endian),即高位字节存储在低地址。
    • 主机字节序:通常是小端字节序(little-endian),但这取决于机器架构。
  • 端口号是 16 位的整数,通常我们使用 htons() 来确保在网络传输时,端口号以网络字节序的格式进行传输。

inet_pton()

inet_pton - convert IPv4 and IPv6 addresses from text to binary form(IP 地址转换成二进制形式)。

definition:

#include <arpa/inet.h>int inet_pton(int af, const char *src, void *dst);

返回值:成功返回 1 。src IP 地址格式错误返回 0 。af 不合法 返回 -1 。

connect()

#include <sys/socket.h>
int connect(int socket, const struct sockaddr *address, socklen_t address_len);

返回值:成功返回0,其他返回 -1 。

send()

#include <sys/socket.h>
ssize_t send(int socket, const void *buffer, size_t length, int flags);

返回值:发送成功,返回发送数据的字节数;失败,返回 -1 。

recv()

#include <sys/socket.h>
ssize_t recv(int socket, void *buffer, size_t length, int flags);

返回值:接收数据成功返回接收数据的字节数;如果没有数据接收且对方已有序关闭连接返回 0;其他错误情况返回 -1 。

send() 和 recv() 中的 flags 参数

send() 和 recv() 的 flags 参数通常设置为 0,表示使用默认的行为模式。

默认行为(flags = 0)的特点:
  • 阻塞模式send()recv() 默认都处于阻塞模式,意味着:
    • send():如果数据无法立刻发送(比如网络缓冲区已满),它会阻塞,直到有足够的空间可以发送数据。
    • recv():如果没有数据可读,它会阻塞,直到接收到至少一个字节的数据,或者对方关闭了连接。
  • 按字节顺序发送/接收send() 会按顺序发送数据,recv() 会按顺序接收数据,返回已接收到的字节数。如果请求的数据量比接收到的少,recv() 会返回已接收到的字节数,剩余的数据需要在后续调用中接收。
  • 正常的数据传输:不进行任何特殊处理,如不启用带外数据、不使用非阻塞模式等。
其他 flags 标志:
  • MSG_OOB:

    • 发送 带外数据(Out-of-Band Data)。通常用于传输紧急数据,但对于大多数应用程序来说,带外数据并不常用。
    • 在 TCP 中,带外数据和普通数据并没有严格的区分,标记为带外数据的行为在很多情况下不起作用。
  • MSG_PEEK:

    • 使 recv() 函数或 recvfrom() 函数可以预读取数据,但数据并不会从缓冲区中被移除。即使数据被读取,下一次调用 recv()recvfrom() 仍然会返回相同的数据。
    • 这种标志在 recv() 上比较常用,但在 send() 上没有直接用途。
  • MSG_DONTROUTE:

    • 发送数据时, 不经过路由表。这个标志告诉内核,不要尝试寻找默认路由,而是直接将数据发送到目标地址。通常用于开发中的调试或非常规的发送需求。
  • MSG_NOSIGNAL:

    • 当使用该标志时, send() 不会在发送过程中因信号的产生而导致 SIGPIPE 信号(即破损的管道错误)。通常与管道或套接字连接相关,如果尝试向已关闭的连接发送数据,默认会收到 SIGPIPE 信号,而通过 MSG_NOSIGNAL 可以避免这种情况。
  • MSG_WAITALL:

    • 用于 recv()recvfrom(),告知内核等待直到接收到指定长度的数据。它确保不会返回少于 length 字节的数据,除非连接关闭。
    • 这对于一些需要完整接收数据的场景非常有用,尤其是在接收固定大小的数据时。

close()

释放之前创建的套接字的资源。

使用 C++ 面向对象编程思想封装

// client.cpp
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>class TcpClient {
private:int sockfd;struct sockaddr_in server_addr;public:// 构造函数TcpClient(const std::string& server_ip, int server_port) {// 创建套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("Socket creation failed");exit(EXIT_FAILURE);}// 设置服务器地址结构memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(server_port);if (inet_pton(AF_INET, server_ip.c_str(), &server_addr.sin_addr) <= 0) {perror("Invalid address or Address not supported");close(sockfd);exit(EXIT_FAILURE);}}// 连接服务器void connectToServer() {if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {perror("Connection failed");close(sockfd);exit(EXIT_FAILURE);}std::cout << "Connected to server\n";}// 发送数据void sendData(const std::string& message) {if (send(sockfd, message.c_str(), message.length(), 0) == -1) {perror("Send failed");close(sockfd);exit(EXIT_FAILURE);}std::cout << "Message sent: " << message << std::endl;}// 接收数据void receiveData() {char buffer[1024];int bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0);if (bytes_received == -1) {perror("Recv failed");close(sockfd);exit(EXIT_FAILURE);}buffer[bytes_received] = '\0'; // Add null terminatorstd::cout << "Received from server: " << buffer << std::endl;}// 关闭套接字void closeConnection() {close(sockfd);}// 析构函数~TcpClient() {closeConnection();}
};int main() {TcpClient client("127.0.0.1", 12000);client.connectToServer();client.sendData("Hello, server!");client.receiveData();return 0;
}

编译:g++ -o client client.cpp

Linux C语言 socket 编程 server 端

// server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>    // 提供 close、read 和 write (这里通过 send 间接使用,因为 send 是 write 的一个更高级别的封装)
#include <arpa/inet.h>   // 提供了用于网络地址转换的函数声明,如将点分十进制格式的 IP 地址转换为网络字节序,以及将端口号从主机字节序转换为网络字节序。#define PORT 12000    // socket 绑定的端口好
#define BUFFER_SIZE 1024       // 缓存大小int main() {int server_fd, new_socket;struct sockaddr_in address;     // 结构体,用于存储 IPv4 地址和端口号的信息。int opt = 1;int addrlen = sizeof(address);char buffer[BUFFER_SIZE] = {0};const char *hello = "Hello from server";// 创建socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {/*AF_INET:指定地址族为 IPv4。SOCK_STREAM:指定套接字类型为 TCP(面向连接的字节流)。0:指定协议为 0,通常对于 SOCK_STREAM 和 AF_INET,这个参数为 0,意味着使用 TCP。*/perror("socket failed");exit(EXIT_FAILURE);}// 绑定socket到端口if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}address.sin_family = AF_INET; // IPv4address.sin_addr.s_addr = INADDR_ANY; // 任何地址address.sin_port = htons(PORT); // 端口if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 监听连接if (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}// 接受连接while (1) {printf("等待连接...\n");if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept");exit(EXIT_FAILURE);}// 接收数据read(new_socket, buffer, BUFFER_SIZE);printf("收到消息: %s\n", buffer);// 发送数据send(new_socket, hello, strlen(hello), 0);printf("欢迎消息已发送\n");// 关闭当前连接close(new_socket);}// 关闭服务器socketclose(server_fd);return 0;
}

编译:gcc -o server server.c

setsockopt()

#include <sys/socket.h>
int setsockopt(int socket, int level, int option_name,const void *option_value, socklen_t option_len);
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}

setsockopt() 函数,用于设置套接字的选项。是在创建一个服务器套接字时,配置套接字的一些行为或属性。SO_REUSEADDR 选项的设置允许在套接字关闭后,立即重用相同的地址(IP 和端口),而不必等到操作系统回收该端口。

level:指定选项所在的协议层,通常是 SOL_SOCKET,表示设置的是套接字级别的选项。

optval:指向一个存储选项值的内存区域。这个值会根据不同的选项而变化,通常是一个整数或布尔值。

optlenoptval 指向的内存区域的大小(字节数)。

int opt = 1; opt 是 SO_REUSEADDR 选项的值通常是 1(启用)或 0(禁用)。sizeof(opt) 用来确定 opt 变量的大小。

setsockopt() 返回值:设置成功返回 0,否则返回 -1 。

address.sin_addr.s_addr = INADDR_ANY; INADDR_ANY 是一个特殊的常量,值是 0.0.0.0,它代表任何可用的网络接口地址(所有的 IPv4 地址),通常用于绑定套接字到所有本地可用的网络接口,可以使得服务器程序更灵活地接受来自不同网络接口的请求。

bind()

#include <sys/socket.h>
int bind(int socket, const struct sockaddr *address,socklen_t address_len);

返回值:绑定成功成功返回 0,否则返回 -1 。

listen()

#include <sys/socket.h>
int listen(int socket, int backlog);

返回值:监听成功返回 0,否则返回 -1 。

accept()

#include <sys/socket.h>
int accept(int socket, struct sockaddr *restrict address,socklen_t *restrict address_len);

返回值:接受失败返回 -1,成功则返回接受套接字的非负文件描述。

read()

从套接字接收缓存中读取收到的数据。

#include <unistd.h>
ssize_t read(int fildes, void *buf, size_t nbyte);

成功完成后,将返回一个非负整数,表示实际读取的字节数。否则,函数将返回 -1 并设置 errno 以指示错误。

server 端 C++

// server.cpp
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define PORT 12000     // 端口
#define BUFFER_SIZE 1024class Server {
public:Server() {server_fd = socket(AF_INET, SOCK_STREAM, 0);if (server_fd < 0) {std::cerr << "Socket creation failed" << std::endl;exit(EXIT_FAILURE);}sockaddr_in address;int addrlen = sizeof(address);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) {std::cerr << "Bind failed" << std::endl;close(server_fd);exit(EXIT_FAILURE);}if (listen(server_fd, 3) < 0) {std::cerr << "Listen failed" << std::endl;close(server_fd);exit(EXIT_FAILURE);}std::cout << "Server is listening on port " << PORT << std::endl;}~Server() {close(server_fd);}void acceptConnection() {sockaddr_in address;int addrlen = sizeof(address);int new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);if (new_socket < 0) {std::cerr << "Accept failed" << std::endl;return;}char buffer[BUFFER_SIZE];int valread = read(new_socket, buffer, BUFFER_SIZE);std::cout << "Message from client: " << buffer << std::endl;const char *response = "Hello from server";send(new_socket, response, strlen(response), 0);std::cout << "Response sent to client" << std::endl;close(new_socket);}private:int server_fd;
};int main() {Server server;while (true) {server.acceptConnection();}return 0;
}

编译:g++ -o server server.cpp

运行

请添加图片描述

Linux socket 编程在线英文文档

点击跳转

相关文章:

Linux C/C++ Socket 编程

本文目录 Linux C语言 socket 编程 client 端头文件 unistd.h & arpa/inet.h1. **unistd.h**2. **arpa/inet.h** socket() 创建套接字sockaddr_in 结构体inet_pton()connect()send()recv()send() 和 recv() 中的 flags 参数**默认行为&#xff08;flags 0&#xff09;的特…...

Flutter错误: uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared

前言 今天要做蓝牙通信的功能&#xff0c;我使用了flutter_reactive_ble这个库&#xff0c;但是在运行的时候发现一下错误 Launching lib/main.dart on AQM AL10 in debug mode... /Users/macbook/Desktop/test/flutter/my_app/android/app/src/debug/AndroidManifest.xml Err…...

Spark 的容错机制:保障数据处理的稳定性与高效性

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…...

TCP可靠连接的建立和释放,TCP报文段的格式,UDP简单介绍

TCP连接的建立&#xff08;三次握手&#xff09; 建立连接使用的三报文 SYN 报文仅用于 TCP 三次握手中的第一个和第二个报文&#xff08;SYN 和 SYN-ACK&#xff09;&#xff0c;用于初始化连接的序列号。数据传输阶段不再使用 SYN 标志。 SYN 报文通常只携带连接请求信息&a…...

LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略

LLMs之PDF&#xff1a;zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略 目录 zeroX的简介 1、支持的文件类型 zeroX的安装和使用方法 T1、Node.js 版本&#xff1a; 安装 使用方法 使用文件 URL&#xff1a; 使用本地路径&…...

开源数据库 - mysql - mysql-server-8.4(gtid主主同步+ keepalived热切换)部署方案

前置条件 假设主从信息 mysqlhostport主192.168.1.13306从192.168.1.23306vip192.168.1.3 部署流程 导出测试环境表结构与数据 使用mysqldump ./mysqldump -ulzzc -p -S /tmp/mysql3306.sock --single-transaction --database lzzc > databaseLZZCxxxx.sql查看gtid号 …...

Java全栈体系路线

Java全栈体系路线 摘要 Java 是一门广泛应用于企业级开发的语言&#xff0c;具有强大的生态系统和丰富的工具支持。成为一名 Java 全栈开发工程师不仅需要掌握后端开发技能&#xff0c;还需要具备前端开发和数据库管理的能力。本文将详细介绍 Java 全栈开发的学习路线&#x…...

【Unity基础】Unity中如何导入字体?

在Unity中&#xff0c;不能像其他软件一样直接使用字体文件&#xff0c;需要通过FontAssetCreator将其转换成Texture的Asset文件&#xff0c;然后才能使用。 本文介绍了使用FontAssetCreator导入字体的过程&#xff0c;并对其参数设置进行了说明。 Font Asset Creator 是 Uni…...

使用NVIDIA GPU加速FFmpeg视频压制:完全指南

引言 在视频处理领域&#xff0c;FFmpeg是一个强大的工具。结合NVIDIA的硬件编码器NVENC&#xff0c;我们可以实现快速高效的视频压制。本文将详细解析一个实用的视频压制命令&#xff0c;帮助你理解每个参数的作用。 核心命令 ffmpeg -i input.mp4 -vf scale640:360 -c:v h…...

Python学习:scipy是什么?

文章目录 一、Scipy简介二、Scipy的组成部分1. 基础功能&#xff1a;2. 特殊函数&#xff1a;3. 优化&#xff1a;4. 积分&#xff1a;5. 插值&#xff1a;6. 信号处理&#xff1a;7. 图像处理&#xff1a;8. 统计分布&#xff1a;9. 空间数据结构和算法&#xff1a;10. 稀疏矩…...

spark的学习-05

SparkSql 结构化数据与非结构化数据 结构化数据就类似于excel表中的数据&#xff08;统计的都是结构化的数据&#xff09;一般都使用sparkSql处理结构化的数据 结构化的文件&#xff1a;JSON、CSV【以逗号分隔】、TSV【以制表符分隔】、parquet、orc 结构化的表&#xff1a;…...

SQL注入(SQL Injection)详解

SQL注入&#xff08;SQL Injection&#xff09;是一种代码注入技术&#xff0c;它通过在应用程序的输入字段中插入或“注入”恶意的SQL语句&#xff0c;从而操控后端数据库服务器执行非预期的命令。这种攻击方式常用于绕过应用程序的安全措施&#xff0c;未经授权地访问、修改或…...

深入解析 OpenHarmony 构建系统-2-目录结构与核心组件

引言 OpenHarmony作为一款面向全场景的分布式操作系统,其构建系统在开发过程中扮演着至关重要的角色。本文将详细介绍OpenHarmony构建系统的目录结构和核心组件,帮助开发者更好地理解和使用这一强大的工具。 目录结构概览 以下是OpenHarmony构建系统的目录结构,每个目录和…...

网络安全应急响应(归纳)

目录 一、概述二、理论 系统排查 系统基本信息 windowsLinux用户信息 WindowsLinux启动项&#xff1a;开机系统在前台或者后台运行的程序&#xff0c;是病毒等实现持久化驻留的常用方法。 WindowsLinux任务计划&#xff1a;由于很多计算机都会自动加载“任务计划”&#xff0c…...

【网络协议栈】网络层(上)网络层的基本理解、IP协议格式、网络层分组(内附手画分析图 简单易懂)

绪论​ “It does not matter how slowly you go as long as you do not stop.”。本章是自上而下的进入网络协议栈的第三个篇幅–网络层–&#xff0c;本章我将带你了解网络层&#xff0c;以及网络层中非常重要的IP协议格式和网络层的分片组装问题&#xff0c;后面将持续更新网…...

数据库类型介绍

1. 关系型数据库&#xff08;RDBMS&#xff09; 关系型数据库是最常见的一类数据库&#xff0c;它们通过表&#xff08;Table&#xff09;来存储数据&#xff0c;表之间通过关系&#xff08;如主键和外键&#xff09;来关联。 • MySQL&#xff1a;开源的关系型数据库管理系统&…...

一步一步从asp.net core mvc中访问asp.net core WebApi

"从asp.net core mvc中访问asp.net core WebApi"看到这个标题是不是觉得很绕口啊&#xff0c;但的确就是要讲一讲这样的访问。前面我们介绍了微信小程序访问asp.net core webapi(感兴趣的童鞋可以看看前面的博文有关WEBAPI的搭建)&#xff0c;这里我们重点不关心如何…...

linux中kubectl命令使用

一.命令介绍 kubectl 是 Kubernetes 集群管理的命令行工具&#xff0c;用于与 Kubernetes API 交互。你可以通过它来管理和操作 Kubernetes 集群中的资源&#xff0c;如 Pod、Deployment、Service 等。下面是如何在不同操作系统上下载和使用 kubectl 的方法。 二.下载 kubect…...

Linux 系统结构

Linux系统一般有4个主要部分&#xff1a;内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构&#xff0c;它们使得用户可以运行程序、管理文件并使用系统。 1. linux内核 内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;它…...

ESP32-S3设备智能化升级,物联网无线AI语音交互,让生活更加便捷和有趣

在人工智能和物联网技术的推动下&#xff0c;无线AI语音交互技术正在成为智能设备的新选择。这种技术的发展&#xff0c;不仅改变了我们与设备的沟通方式&#xff0c;更开启了一个新的智能交互方案。 想象一下&#xff0c;通过简单的语音指令&#xff0c;就能控制家中的灯光、…...

Python的函数(补充浅拷贝和深拷贝)

一、定义 函数的定义&#xff1a;实现【特定功能】的代码块。 形参&#xff1a;函数定义时的参数&#xff0c;没有实际意义 实参&#xff1a;函数调用/使用时的参数&#xff0c;有实际意义 函数的作用&#xff1a; 简化代码提高代码重用性便于维护和修改提高代码的可扩展性…...

oracle查询字段类型长度等字段信息

1.查询oracle数据库的字符集 SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER NLS_CHARACTERSET; 2.查询字段长度类型 SELECT * FROM user_tab_columns WHERE table_name user AND COLUMN_NAME SNAME 请确保将user替换为您想要查询的表名。sname为字段名 这里的字…...

C语言 | Leetcode C语言题解之第559题N叉树的最大深度

题目&#xff1a; 题解&#xff1a; /*** Definition for a Node.* struct Node {* int val;* int numChildren;* struct Node** children;* };*/int maxDepth(struct Node* root) {if (!root) {return 0;}int depth 0;// 创建空队列const int qCap 10e4 1;str…...

光流法(Optical Flow)

一、简介 光流法&#xff08;Optical Flow&#xff09;是一种用于检测图像序列中像素运动的计算机视觉技术。其基于以下假设&#xff1a; 1.亮度恒定性假设&#xff1a;物体在运动过程中&#xff0c;其像素值在不同帧中保持不变。 2.空间和时间上的连续性&#xff1a;相邻像素之…...

Rancher的安装

1. 概览 1.1 用户界面优势 Rancher 提供了一个直观的图形用户界面&#xff08;GUI&#xff09;。对于不熟悉 Kubernetes 复杂的命令行操作&#xff08;如使用kubectl&#xff09;的用户来说&#xff0c;通过 Rancher 的界面可以方便地进行资源管理。例如&#xff0c;用户可以在…...

【Linux】获得同一子网下当前在线设备IP/Latency/MAC 通过nmap指定CIDR扫描当前在线设备

【Linux】获得同一子网下当前在线设备IP/Latency/MAC 通过nmap指定CIDR扫描当前在线设备 通过路由器的后台&#xff0c;查看当前在线设备&#xff0c;受到网卡版本的影响&#xff0c;有时会有部分设备看不见MAC和分配的IP。此时&#xff0c;可以借助命令行工具扫描子网下所有连…...

Ubuntu22.04安装DataEase

看到DataEase的驾驶舱&#xff0c;感觉比PowerBI要好用一点&#xff0c;于是搭建起来玩玩。Dataease推荐的操作系统是Ubuntu22.04/Centos 7。 下载了Ubuntu22.04和DataEase 最新版本的离线安装包 一.安装ubuntu22.04 在安装的时候&#xff0c;没有顺手设置IP地址信息&#xff…...

Taro React-Native IOS 打包发布

http网络请求不到 配置 fix react-native facebook::flipper::SocketCertificateProvider‘ (aka ‘int‘) is not a function or func_rn运行debug提示flipper-CSDN博客 Xcode 15&#xff08;iOS17&#xff09;编译适配报错_no template named function in namespace std-CS…...

【卷积神经网络CNN】基于深度学习动物图像识别系统(完整系统源码+数据库+开发笔记+详细部署教程+启动教程)✅

目录 【卷积神经网络CNN】基于深度学习动物图像识别系统&#xff08;完整系统源码数据库开发笔记详细部署教程启动教程&#xff09;✅ 一、项目背景 二、项目目标 三、项目创新点 四、项目功能 五、开发技术介绍 六、数据库设计 七、启动步骤 八、项目功能展示 九、开…...

图像处理椒盐噪声

椒盐噪声&#xff0c;也称为脉冲噪声&#xff0c;是图像中经常见到的一种噪声。它是一种随机出现的白点或者黑点&#xff0c;可能是亮的区域有黑色像素或是在暗的区域有白色像素&#xff08;或是两者皆有&#xff09;。这些白点和黑点会在图像中随机分布&#xff0c;导致图像中…...

怎么申请建立个人免费网站/查询网

CSGO的官方服务器是有排位等级制度存在的&#xff0c;让同等级的玩家共同游戏。那么csgo官匹隐藏分怎么看 ?下面小编就为大家带来官匹段位升级机制。等级01 Silver I 白银—级等级02 Silver II 白银二级等级03 Silver III 白银三级等级04 Silver IV 白银四级等级05 Silver Eli…...

岳阳建设网站公司/链接网

以Edit控件为例进行说明&#xff0c;在Dialog类中&#xff0c;相应WM_CTLCOLOR消息。就是OnCtlColor(),那里面判断传入进来的ID号为你要的编辑控件&#xff0c;然后&#xff0c;用得到的DC&#xff0c;设置字体&#xff0c;颜色&#xff0c;最后返回一个笔刷&#xff0c;这个笔…...

免费做店招的网站/搭建一个app平台需要多少钱

目录 主要函数 caffe_cpu_gemm 函数caffe_cpu_gemv 函数caffe_axpy 函数caffe_set 函数caffe_add_scalar 函数caffe_copy 函数caffe_scal 函数caffeine_cup_axpby 函数caffe_add caffe_sub caffe_mul caffe_div 函数caffe_powx caffe_sqr caffe_exp caffe_abs 函数int caffe_rn…...

微信网站建设报价/网页设计需要学什么软件

本文首发于烂泥行天下。在安装、管理和使用mysql过程中&#xff0c;你是不是需要记忆很多的mysql命令。而且对于新手来说&#xff0c;很不多的命令不知道该如何应用&#xff0c;对于老手来说很多命令时间长了忘记具体的用法。其实mysql的帮助信息&#xff0c;已经给我们提供很全…...

wordpress 图片上传限制/东莞百度快速排名优化

operator.itemgetter函数operator模块提供的itemgetter函数用于获取对象的哪些维的数据&#xff0c;参数为一些序号(即需要获取的数据在对象中的序号)&#xff0c;下面看例子。a [1,2,3]>>> boperator.itemgetter(1) //定义函数b&#xff0c;获取对象的第1个域的…...

的网站建设/百度站长工具seo综合查询

文章目录0、打包配置&#xff08;Artifacts&#xff09;1、tomcat 的使用2、配置注释模板3、配置快捷键模板0、打包配置&#xff08;Artifacts&#xff09; Project -> Structure -> Artifacts 1、tomcat 的使用 1.在下拉列表中&#xff0c;点击Edit Configuration […...