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

Linux套接字Socket

Linux套接字Socket

前提知识补充

  • 为不同机器上的两个进程之间提供通信机制

  • 主机字节序小端存储,网络字节序大端存储

  • 特点TCPUDP
    连接类型面向连接无连接
    可靠性
    有序性保证数据包按顺序到达不保证数据包顺序
    流量控制有滑动窗口机制
    拥塞控制有拥塞控制机制
    复杂性较高较低
    实时性较差较好
    适用场景文件传输、Web 应用、电子邮件等实时音视频、在线游戏、DNS 查询等

Socket

前情提示

inet_addr函数
  • 将点分十进制格式的 IPv4 地址字符串转换为网络字节序的 32 位无符号整数
接口代码
#include <arpa/inet.h>in_addr_t inet_addr(const char* ip_address);
参数解释
  • ip_address: 点分十进制IPV4
返回值
  • 网络字节序的 32 位无符号整数
实例代码
#include <stdio.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>int main() {// 定义IPV4地址const char *ip_address = "192.168.1.1";in_addr_t ip;// 将点分十进制格式的 IP 地址转换为 32 位无符号整数ip = inet_addr(ip_address);if (ip == INADDR_NONE) {perror("inet_addr");printf("无效的 IP 地址: %s\n", ip_address);return 1;}// 打印转换后的 IP 地址printf("IP 地址: %s\n", ip_address);printf("转换后的 32 位无符号整数: 0x%08X\n", (unsigned int)ip);return 0;
}
套接字结构定义
#include <netine/in.h>struct sockaddr_in
{// 地址族,对于IPV4地址应设置为 AF_INETsa_family_t sin_family;// 16位端口号,以大端字节序存储in_port_t sin_port;// 32位IPV4地址,以大端字节序存储,指明通信所使用的IP地址/*** struct in_addr {*       in_addr_t s_addr;  /* 32 位无符号整数,表示 IP 地址 */* };*/struct in_addr sin_addr;// 填充字段,一般设置为0unsigned char sin_zero[8]
}
字节序
  • 将16位和32位整数在主机字节序和网络字节序之间进行转换
接口代码
#include <netinet/in.h>// h:hostname -- 本地 
// to:to -- 转变
// n:network -- 网络
// l:32位
// s:16位
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned short int netlong);
unsigned short int ntohs(unsigned short int netshort);
gethostname函数
  • 获取主机名
接口代码
#include <unistd.h>int gethostname(char* name,int namelength);
参数解释
  • name: 自定义缓冲区
  • namelength: 自定义缓冲区大小
返回值
  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno 以指示错误原因
实例代码
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>int main()
{char buf[256];int res;res = gethostname(buf, sizeof(buf));if (res == 0)printf("本机地址为: %s\n", buf);return 0;
}
地址转换打印函数inet_ntoa
  • 将网络字节转换位可打印四点表示法格式的字符串
接口代码
#include <arpa/inet.h>char* inet_ntoa(struct in_addr in);
参数解释
  • in: 32位无符号整数
返回值
  • 成功时,返回一个指向静态分配的字符数组的指针,该数组包含点分十进制格式的 IP 地址字符串。
  • 如果输入无效,则返回 NULL
实例代码
#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>int main()
{struct in_addr addre;addre.s_addr = inet_addr("192.168.1.1");char *buf;buf = inet_ntoa(addre);printf("四点表示法字符串为: %s\n", buf);return 0;
}

服务器端and客户端

TCP执行流程

在这里插入图片描述

UDP执行流程

在这里插入图片描述

socket(创建)
  • 创建通信连接句柄
接口代码
#include <sys/socket.h>int socket(int domain,int type,int protocol);
参数解释
  • domain:指定通信域(也称为地址族),决定了将使用的寻址方案。常见的值包括:

    • AF_INET:IPv4 网络协议。
    • AF_INET6:IPv6 网络协议。
    • AF_UNIXAF_LOCAL:本地通信(同一台机器上的进程间通信)。
  • type:指定套接字的类型,决定了通信方式。常见的值包括:

    • SOCK_STREAM:提供有序的、可靠的、基于连接的字节流服务,通常使用 TCP 协议。

    • SOCK_DGRAM:提供无连接的、不可靠的数据报服务,通常使用 UDP 协议。

    • SOCK_RAW:提供原始网络协议访问,通常用于底层网络编程。

  • protocol:指定具体的协议。大多数情况下,可以设置为 0。

返回值
  • 成功时,返回一个非负整数,即新创建的套接字的文件描述符。
  • 失败时,返回 -1,并设置 errno 以指示错误原因。
实例代码
// 参考下方汇总
bind(绑定)
  • 把电脑上真正的网络地址与一个套接字标识符关联起来
接口代码
#include <sys/types.h>
#include <sys/socket.h>int bind(int sockfd,const struct sockaddr* address,size_t addrlen);
参数解释
  • sockfd: 要绑定的套接字描述符
  • address: 要绑定的地址信息
  • addrlen: address接口体大小
返回值
  • 成功时,返回 0
  • 失败时,返回 -1,并设置 errno 以指示错误原因
实例代码
// 参考下方汇总
listen(监听)
  • 绑定之后,在任何客户端系统可以连接到新建立的服务器端点之前,服务器必须设定为等待连接
接口代码
#include <sys/socket.h>int listen(int sockfd,int backlog);
参数解释
  • sockfd:要设置为监听状态的套接字描述符。
  • backlog:指定等待连接的最大队列长度。这是指尚未被 accept 接受但已经完成三次握手的连接请求的数量
返回值
  • 成功时,返回 0。
  • 失败时,返回 -1,并设置 errno 以指示错误原因。

实例代码

// 参考下方汇总
accept(接受连接)
  • 当服务器收到客户端connect请求时,必须建立一个全新的套接字来处理这个特定的通信。第一个套接字只用来建立通信,第二个套接字由accept完成
接口代码
#include <sys/types.h>
#include <sys/socket.h>int accept(int sockfd,struct sockaddr* address,size_t* add_len);
参数解释
  • sockfd: 处于监听状态的套接字
  • address: 当服务器调用 accept 函数接受一个新的连接请求时,address 会被填充为连接到服务器的客户端的地址信息
  • address: 指定address缓冲区大小,并在返回时更新实际存储长度
返回值
  • 成功时,返回一个新的套接字描述符,该描述符用于与客户端进行通信。
  • 失败时,返回 -1,并设置 errno 以指示错误原因。
实例代码
// 参考下方汇总
connect(请求连接)
  • 客户程序通过一个未命名套接字和服务器监听套接字之间建立连接的方法来连接到服务器
接口代码
#include <sys/socket.h>int connect(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
参数解释
  • sockfd: 指定的套接字将连接到参数address指定服务器套接字
  • addr: 目的地址,IPV4或IPV6
  • addrlen: addr结构体大小

返回值

  • 成功时,返回 0。
  • 失败时,返回 -1,并设置 errno 以指示错误原因。
实例代码
// 参考下方汇总
recv(接收数据)
  • 从指定的文件描述符读取数据
接口代码
#include <sys/types.h>
#include <sys/socket.h>ssize_t recv(int sockfd,void* buffer,size_t length,int flags);
参数解释
  • sockfd:要从中接收数据的套接字描述符。
  • buf:指向一个缓冲区的指针,用于存储接收到的数据。
  • len:缓冲区的大小(以字节为单位)。
  • flags:指定调用的行为选项。常见的标志包括:
    • 0:默认行为,阻塞直到有数据可读或发生错误。
    • MSG_PEEK:查看传入的数据而不从输入队列中移除。
    • MSG_DONTWAIT:非阻塞模式,如果当前没有数据可读,则立即返回 -1 并设置 errnoEAGAINEWOULDBLOCK
    • MSG_WAITALL:阻塞直到至少 len 字节的数据被接收,或者发生错误
返回值
  • 成功时,返回实际接收到的字节数(可能少于请求的 len)。
  • 如果连接关闭且所有数据已被读取,返回 0。
  • 失败时,返回 -1,并设置 errno 以指示错误原因。
实例代码
// 参考下方汇总
send(发送数据)
  • 向指定套接字发送数据
接口代码
#include <sys/types.h>
#include <sys/socket.h>ssize_t send(int sockfd,const void* buffer,size_length len,int flags);
参数解释
  • ockfd:要发送数据的套接字描述符。
  • buf:指向包含要发送数据的缓冲区的指针。
  • len:要发送的数据长度(以字节为单位)。
  • flags:指定调用的行为选项。常见的标志包括:
    • 0:默认行为,阻塞直到所有数据被发送或发生错误。
    • MSG_DONTWAIT:非阻塞模式,如果当前无法立即发送数据,则立即返回 -1 并设置 errnoEAGAINEWOULDBLOCK
    • MSG_NOSIGNAL:防止 SIGPIPE 信号,当对端已经关闭连接时,不会产生 SIGPIPE 信号。
    • MSG_OOB:发送带外数据(out-of-band data)。
返回值
  • 成功时,返回实际发送的字节数(可能少于请求的 len)。
  • 如果连接关闭且所有数据已被发送,返回 0。
  • 失败时,返回 -1,并设置 errno 以指示错误原因。
实例代码
// 参考下方汇总
close(关闭)
  • 通过文件描述符关闭套接字
接口代码
#include <unistd.h>int close(int fd);
参数解释
  • fd:要关闭的文件描述符。
返回值
  • 成功时,返回 0。
  • 失败时,返回 -1,并设置 errno 以指示错误原因。
实例代码
// 参考下方汇总
recvfrom(接收)
  • UDP接收函数
接口代码
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>ssize_t revcfrom(int sockfd,void* message,size_t length,int flags,struct sockaddr* send_add,socklen_t* add_len);
参数解释
  • sockfd: Socket创建文件描述符
  • message: 存储接收数据
  • length: message缓冲区的最大长度
  • flags: 用于修改revcfrom的行为
    • MSG_PEEK:查看传入的数据,但不将其从输入队列中移除。
    • MSG_WAITALL:等待接收指定数量的字节,除非发生错误或信号中断。
    • MSG_DONTWAIT:使 recvfrom 在非阻塞模式下操作,如果没有数据可读,则立即返回 -1 并设置 errnoEAGAINEWOULDBLOCK
  • send_addr: 存储发送方的地址信息
    • 当为NULL时雨recv工作方式相同
  • add_len: send_addr的实际大小
返回值
  • 成功:返回接收到的字节数(可能小于 length)。
  • 失败:返回 -1,并设置 errno 以指示错误类型。
实例代码
// 参考下方汇总
sendto(发送)
  • UDP发送函数
接口代码
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>ssize_t sendto(int sockfd, const void *message, size_t length, int flags,const struct sockaddr *dest_addr, socklen_t dest_len);
参数解释
  • sockfd: Socket创建文件描述符
  • message: 要发送的信息
  • length: 要发送信息的长度
  • flags: 用于修改sendto
    • MSG_CONFIRM:请求确认。
    • MSG_DONTROUTE:不要路由,直接发送到本地网络。
    • MSG_EOR:记录结束。
    • MSG_OOB:带外数据。
    • MSG_NOSIGNAL:防止 SIGPIPE 信号。
  • dest_addr: 指向发送到目标地址的信息
  • dest_len: dest_addr结构体大小
返回值
  • 成功:返回发送的字节数(可能小于 length)。
  • 失败:返回 -1,并设置 errno 以指示错误类型。
实例代码
// 见下方汇总
综合实例–TCP连接

server-tcp.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>int port = 7777; // 端口号
int main()
{char buf[4096]; // 接收服务器端返回信息缓冲区int socketDes;int addLen; // 接收连接时地址信息长度// 创建套接字文件描述符socketDes = socket(AF_INET, SOCK_STREAM, 0);// 地址信息struct sockaddr_in sin;bzero(&sin, sizeof(sin));sin.sin_family = AF_INET;/*** INADDR_ANY 是一个常量,值为 0x00000000,表示绑定到所有可用的网络接口。* 这意味着服务器将监听所有可用的网络接口上的指定端口*/sin.sin_addr.s_addr = INADDR_ANY;sin.sin_port = htons(port); // 监听端口//  绑定int bindRes;bindRes = bind(socketDes, (struct sockaddr *)&sin, sizeof(sin));if (bindRes == -1){printf("bind--");exit(1);}// 监听int listenRes;listenRes = listen(socketDes, 20);if (listenRes == -1){perror("listen--");exit(1);}while (1){struct sockaddr_in pin;int temp_sock_descriptor;temp_sock_descriptor = accept(socketDes, (struct sockaddr *)&pin, &addLen);// 打印客户端信息printf("Connection accepted from %s:%d\n", inet_ntoa(pin.sin_addr), ntohs(pin.sin_port));if (temp_sock_descriptor == -1){perror("accept--");exit(1);}size_t len;len = recv(temp_sock_descriptor, buf, sizeof(buf), 0);if (len == -1){perror("recv--");exit(1);}printf("喜羊羊: %s\n", buf);// 示例:向客户端发送一条欢迎消息const char *sendMessage = "Welcome to the server!\n";if (strcmp(buf, "你好") == 0)sendMessage = "你也好";send(temp_sock_descriptor, sendMessage, strlen(sendMessage), 0); // 发送数据memset(buf, 0, 4096); // 清空数组close(temp_sock_descriptor); // 关闭套接字}return 0;
}

client-tcp.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>// 服务器地址
const char *hostname = "127.0.0.1";
int port = 7777;int main(int argc, char *argv[])
{char buf[4096];int socketDes;char *message;if (argc < 2){printf("发送信息不能为空\n");exit(1);}message = argv[1];// 创建套接字文件描述符socketDes = socket(AF_INET, SOCK_STREAM, 0);if (socketDes == -1){perror("socket--");exit(1);}// 处理对方IP数据struct hostent *server_host_name;server_host_name = gethostbyname(hostname);if (server_host_name == 0){perror("接受失败--");exit(1);}struct sockaddr_in pin;bzero(&pin, sizeof(pin));pin.sin_family = AF_INET;pin.sin_addr.s_addr = ((struct in_addr *)(server_host_name->h_addr))->s_addr;pin.sin_port = htons(port);// 请求连接int res;res = connect(socketDes, (void *)&pin, sizeof(pin));if (res == -1){perror("res--");exit(1);}// 发送数据ssize_t len;len = send(socketDes, message, sizeof(message), 0);// 接收数据ssize_t reveLen;reveLen = recv(socketDes, buf, sizeof(buf), 0);printf("灰太狼: %s\n", buf);// 关闭close(socketDes);exit(0);
}
综合实力–UDP连接

server-udp.c

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>int main(int argc, char *argv[])
{int socketDes;socketDes = socket(AF_INET, SOCK_DGRAM, 0);if (socketDes < 0){printf("文件描述符创建失败\n");exit(1);}struct sockaddr_in servAddr;struct sockaddr_in clientAddr;servAddr.sin_family = AF_INET;servAddr.sin_addr.s_addr = htonl(INADDR_ANY);servAddr.sin_port = htons(7777);int rc = bind(socketDes, (struct sockaddr *)&servAddr, sizeof(servAddr));if (rc < 0){printf("绑定失败\n");exit(1);}printf("等待接收信息\n");char msg[50];int cliLen, n;while (1){memset(msg, 0x0, 50);cliLen = sizeof(clientAddr);n = recvfrom(socketDes, msg, 50, 0, (struct sockaddr *)&clientAddr, &cliLen);if (n < 0){printf("信息接受失败\n");continue;}printf("%s: from %s:UDP %u : %s\n", argv[0], inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), msg);int sendToRes;char *res = "你也ggg";sendToRes = sendto(socketDes, res, sizeof(res), 0, (struct sockaddr *)&clientAddr, sizeof(clientAddr));if (sendToRes < 0){printf("返回消息失败\n");exit(1);}}exit(0);
}

client-udp.c

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>int port = 7777;int main(int argc, char *argv[])
{int socketDes;char buf[4096];struct sockaddr_in cliAddr, remoteServAddr;struct hostent *h;if (argc < 3){printf("请输入发送目标地址和发送信息\n");exit(1);}h = gethostbyname(argv[1]);if (h == NULL){printf("%s: 无法识别地址 %s\n", argv[0], argv[1]);exit(1);}remoteServAddr.sin_family = h->h_addrtype;memcpy((char *)&remoteServAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);remoteServAddr.sin_port = htons(port);// 建立套接字文件描述符socketDes = socket(AF_INET, SOCK_DGRAM, 0);if (socketDes < 0){printf("无法打开文件描述符\n");exit(1);}cliAddr.sin_family = AF_INET;// 客户端可以绑定到任何可用的网络接口cliAddr.sin_addr.s_addr = htonl(INADDR_ANY);// 系统自动分配一个可用的端口cliAddr.sin_port = htons(0);int bindRes;bindRes = bind(socketDes, (struct sockaddr *)&cliAddr, sizeof(cliAddr));if (bindRes < 0){printf("绑定失败\n");return 0;}int sendToRes;for (int i = 2; i < argc; i++){sendToRes = sendto(socketDes, argv[i], strlen(argv[i]) + 1, 0, (struct sockaddr *)&remoteServAddr, sizeof(remoteServAddr));if (sendToRes < 0){printf("发送失败\n");close(socketDes);exit(1);}}char msg[50];int cliLen = sizeof(remoteServAddr);int n = recvfrom(socketDes, msg, 50, 0, (struct sockaddr *)&remoteServAddr, &cliLen);if (n < 0){printf("接收信息失败\n");exit(1);}printf("接收到的数据为:%s\n", msg);exit(0);
}

相关文章:

Linux套接字Socket

Linux套接字Socket 前提知识补充 为不同机器上的两个进程之间提供通信机制 主机字节序小端存储,网络字节序大端存储 特点TCPUDP连接类型面向连接无连接可靠性高低有序性保证数据包按顺序到达不保证数据包顺序流量控制有滑动窗口机制无拥塞控制有拥塞控制机制无复杂性较高较低…...

基于 Web 的工业设备监测系统:非功能性需求与标准化数据访问机制的架构设计

目录 案例 【说明】 【问题 1】(6 分) 【问题 2】(14 分) 【问题 3】(5 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于 Web 系统架构设计的叙述&#xff0c;回答问题 1 至问题 3 。 【说明】 某公司拟开发一款基于 Web 的…...

【MySQL】基础入门篇

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解什么是MySQL&#xff0c;如何安装MySQL&#xff0c;简单使用MySQL。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不…...

uni-app vue3封装websocket,支持微信小程序

一、创建useWebSocket.js 文件 // useWebSocket.js // 获取链接的URL前缀 import {BASE_URL } from "./request";import {ref,onMounted,onBeforeUnmount } from "vue";// 假设我们使用 uni-app 的 globalData 或 Vuex 来管理用户状态 // 这里为了简单起…...

杭州算力小镇:AI泛化解锁新机遇,探寻AI Agent 迭代新路径

人工智能技术不断迭代&#xff0c;重点围绕着两个事情&#xff0c;一是数据&#xff0c;二是算力。 算法的迭代推动着AI朝向多模态的方向发展&#xff0c;使之能够灵活应对不同领域的不同任务&#xff0c;模型的任务执行能力大大提升&#xff0c;人工智能泛化能力被推上高潮。…...

IT行业的现状与发展趋势

IT行业的现状与发展趋势 随着信息技术的迅速发展&#xff0c;IT行业已成为全球经济的重要支柱之一。无论是传统行业的数字化转型&#xff0c;还是新兴技术的快速崛起&#xff0c;IT行业都在不断推动社会的进步和发展。本文将探讨IT行业的现状及未来发展趋势。 IT行业的现状 …...

华为认证HCIA篇--网络通信基础

大家好呀&#xff01;我是reload。今天来带大家学习一下华为认证ia篇的网络通信基础部分&#xff0c;偏重一些基础的认识和概念性的东西。如果对网络通信熟悉的小伙伴可以选择跳过&#xff0c;如果是新手或小白的话建议还是看一看&#xff0c;先有个印象&#xff0c;好为后续的…...

【linux】regulartor-fixed

作用&#xff1a;创建一个固定的 regulator。一般是一个 GPIO 控制了一路电&#xff0c;只有开&#xff08;enable&#xff09; \ 关&#xff08;disabled&#xff09;两种操作。 device-tree node io_vdd_en: regulator-JW5217DFND {compatible "regulator-fixed"…...

11年408考研真题解析-计算机网络

第一题&#xff1a; 解析&#xff1a;网络层虚电路服务和数据报服务 传输服务只有&#xff1a;有连接可靠和无连接不可靠两种&#xff0c;直接排除BC。 网络层指的是IP协议&#xff0c;由图二可知&#xff1a;运输层&#xff0c;网际层&#xff0c;网络接口层唯一有连接可靠的协…...

wireshark使用要点

目录 IP过滤 端口过滤 内容过滤 过滤udp 过滤tcp IP过滤 ip.src XXX.XXX.XXX.XXX 只显示消息源地址为XXX.XXX.XXX.XXX的信息 ip.dst XXX.XXX.XXX.XXX 只显示消息目的地址为XXX.XXX.XXX.XXX的信息 ip.addr XXX.XXX.XXX.XXX显示消息源地址为XXX.XXX.XXX.XXX&#xff0…...

WebGL扩展与WebGPU

目录 WebGPU扩展的探索使用实验性或未标准化的特性示例:使用纹理压缩扩展多视口渲染自定义着色器阶段可变多重采样抗锯齿...

基于小安派AiPi-Eyes-Rx的N合1触摸屏游戏

基于小安派AiPi-Eyes-Rx的N合1触摸屏游戏 目前存在的游戏&#xff1a; 植物大战僵尸&#xff1a;demos/pvz羊了个羊&#xff1a;demos/yang消消乐&#xff1a;demos/xiaoxiaole华容道&#xff1a;demos/huarongdao PVZ功能展示可见&#xff1a; 羊了个羊&#xff1a; 消消…...

Java List sort() 排序

sort是java.util.List接口的默认方法。 List的排序方法在Java 8中被引入。 排序方法接受比较器作为参数&#xff0c;并根据指定的比较器对这个列表进行排序。 default void sort(Comparator<? super E> c) 示例代码&#xff1a; import java.text.Collator; import …...

Vue.js 与 Flask 或 Django 后端配合

Vue.js 与 Flask 或 Django 后端配合是一种常见的全栈开发方式&#xff0c;用于构建动态且响应迅速的 Web 应用程序。Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架&#xff0c;而 Flask 和 Django 是 Python 语言的两个非常流行的 Web 框架。下面将分别介绍 Vue.js …...

抽奖拼团卷轴模式系统开发小程序源代码解析

在当今的互联网商业环境中&#xff0c;抽奖、拼团与卷轴模式等创新玩法被广泛应用于小程序开发中&#xff0c;旨在通过多样化的互动方式吸引用户参与&#xff0c;提升用户粘性和平台活跃度。本文将围绕“抽奖拼团卷轴模式系统开发小程序源代码”这一主题&#xff0c;探讨其技术…...

MySql语言操作数据库---增删改查数据库,表,数据

思维导图 SQL语言共分为四大类&#xff1a; 数据定义语言DDL:数据定义语言DDL用来创建数据库中的各种对象-----[库]、[表]、[视图]、[索引]、 数据操纵语言DML:(1) 插入&#xff1a;INSERT (2) 更新&#xff1a;UPDATE (3) 删除&#xff1a;DELETE 数据查询语言DQL:数据查询语…...

C++深入学习string类成员函数(2):容器管理

引言 C 标准库中的容器&#xff08;如 std::string、std::vector、std::list 等&#xff09;都提供了一系列容器管理成员函数&#xff0c;用于处理容器的大小、容量、清空等操作。容器管理成员函数可以分为几类&#xff0c;主要包括容量查询、修改容器大小、清空容器等操作。 …...

MariaDB 和 MySQL 全面对比:选择数据库需要考虑这几点

谁在使用 MySQL 和 MariaDB&#xff1f; MySQL 和 MariaDB 都发布了各自的用户名单。 使用 MySQL 的有 Facebook、Github、YouTube、Twitter、PayPal、诺基亚、Spotify、Netflix 等。 使用 MariaDB 的有 Redhat、DBS、Suse、Ubuntu、1&#xff06;1、Ingenico 等。 功能比较…...

Python 实现图形学几何变换算法

目录 Python 实现图形学几何变换算法几何变换介绍变换矩阵Python 实现几何变换代码解释总结 Python 实现图形学几何变换算法 在计算机图形学中&#xff0c;几何变换是非常重要的概念。它们允许我们对对象的位置、大小、方向进行操作&#xff0c;比如平移、缩放、旋转、反射等。…...

接口测试|超详细面试题【附答案】

今天给姐妹们整理了一套超详细的附答案的接口测试面试题&#xff0c;姐妹们快学起来吧~ 接口测试的重要性&#xff0c;相信不用我多说了。接口测试是现在软件测试工程师一个加分项。因为很多朋友一开始做了几年的软件测试都是在做功能测试&#xff0c;做界面UI的测试&#xff…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...