Linux基础网络编程-Socket通信

news2024/11/14 18:28:37

本文使用C语言,在Centos实现Socket两种通信类型(TCP和UDP)

文章目录

  • 一、安装gcc
  • 二、使用TCP协议,实现Socket(SOCKE_STREAM)流式通信
    • 1. 编写`TCP_server.c`
      • 函数和参数解释
    • 2.编写`TCP_client.c`
      • 函数和参数解释
    • 3. 编译并运行上述两个文件
      • 3.1 编译
      • 3.2 运行(启动两个终端,分别运行)
      • 测试
  • 三、使用数据报协议UDP,实现数据报socket(SOCK_DGRAM)通信
    • 1. 编写`UDP_server.c`
      • 函数和参数解释
    • 2.编写`UDP_client.c`
      • 函数和参数解释
    • 3.编译运行及测试,参考TCP即可

一、安装gcc

如果Centos没有C语言编译器,使用下面命令进行下载安装

yum -y install gcc

使用下列命令查看安装版本

gcc --version

如安装失败,请寻找其他教程

二、使用TCP协议,实现Socket(SOCKE_STREAM)流式通信

1. 编写TCP_server.c

#include <sys/types.h>  // 包含基本系统数据类型
#include <sys/socket.h> // 包含socket函数及数据结构
#include <netinet/in.h> // 定义数据结构sockaddr_in
#include <arpa/inet.h>  // 提供IP地址转换函数
#include <string.h>     // 提供字符串处理函数
#include <stdlib.h>     // 提供通用工具函数
#include <stdio.h>      // 提供输入输出函数
#include <unistd.h>     // 提供对POSIX操作系统API的访问功能

#define QUEUE 20        // 最大同时连接请求数
#define BUFFER_SIZE 1024 // 缓冲区大小

int main()
{
    // 创建socket,指定IPv4协议族,流式socket
    int server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

    // 定义服务器地址结构
    struct sockaddr_in server_sockaddr;
    server_sockaddr.sin_family = AF_INET; // 地址族
    server_sockaddr.sin_port = htons(8887); // 端口号,使用htons进行字节序转换
    server_sockaddr.sin_addr.s_addr = inet_addr("192.168.138.133"); // 服务器IP地址

    // 绑定socket
    if(bind(server_sockfd, (struct sockaddr *)&server_sockaddr, sizeof(server_sockaddr)) == -1)
    {
        perror("bind"); // 如果绑定失败,打印错误信息
        exit(1); // 退出程序
    }

    // 监听网络连接
    if(listen(server_sockfd, QUEUE) == -1)
    {
        perror("listen"); // 如果监听失败,打印错误信息
        exit(1); // 退出程序
    }

    // 定义客户端地址结构
    char buffer[BUFFER_SIZE];
    struct sockaddr_in client_addr;
    socklen_t length = sizeof(client_addr);

    // 接受客户端连接
    int conn = accept(server_sockfd, (struct sockaddr *)&client_addr, &length);
    if(conn < 0)
    {
        perror("connect"); // 如果连接失败,打印错误信息
        exit(1); // 退出程序
    }

    // 数据交换循环
    while(1)
    {
        memset(buffer, 0, sizeof(buffer)); // 清空缓冲区
        int len = recv(conn, buffer, sizeof(buffer), 0); // 接收数据
        if(strcmp(buffer, "exit\n") == 0) // 如果接收到"exit"命令,则退出循环
            break;
        fputs(buffer,{"code":504,"success":false,"message":"Gateway timeout has occurred"} stdout); // 将接收到的数据打印到标准输出
        send(conn, buffer, len, 0); // 将接收到的数据发送回客户端
    }

    // 关闭连接
    close(conn);
    close(server_sockfd);

    return 0;
}

函数和参数解释

  • socket(int domain, int type, int protocol): 创建一个新的socket。

    • domain: 指定协议族,这里是AF_INET(IPv4网络协议)。
    • type: 指定socket类型,这里是SOCK_STREAM(提供顺序化、可靠、双向的基于连接的字节流)。
    • protocol: 指定具体协议,0表示自动选择type对应的默认协议,这里是TCP。
  • bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen): 将socket绑定到本地地址。

    • sockfd: socket文件描述符。
    • addr: 指向本地地址信息的指针。
    • addrlen: 地址信息的长度。
  • listen(int sockfd, int backlog): 开始监听网络连接请求。

    • sockfd: socket文件描述符。
    • backlog: 最大同时连接请求数。
  • accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen): 接受一个连接请求。

    • sockfd: socket文件描述符。
    • addr: 指向客户端地址信息的指针。
    • addrlen: 地址信息的长度。
  • recv(int sockfd, void *buf, size_t len, int flags): 接收数据。

    • sockfd: 连接的socket文件描述符。
    • buf: 指向接收缓冲区的指针。
    • len: 缓冲区的长度。
    • flags: 传输控制标志,这里为0表示无特殊操作。
  • send(int sockfd, const void *buf, size_t len, int flags): 发送数据。

    • sockfd: 连接的socket文件描述符。
    • buf: 指向数据缓冲区的指针。
    • len: 要发送的数据字节数。
    • flags: 传输控制标志,这里为0表示无特殊操作。

这段代码首先创建一个服务器端的socket,然后绑定到本地地址和端口上,之后监听来自客户端的连接请求。一旦接受到连接请求,服务器就会进入一个循环,接收客户端发送的数据并将其回显给客户端,直到接收到"exit"命令为止。最后,关闭客户端和服务器的socket连接。

2.编写TCP_client.c

#include <sys/types.h>  // 包含基本系统数据类型
#include <sys/socket.h> // 包含socket函数及数据结构
#include <netinet/in.h> // 定义数据结构sockaddr_in
#include <arpa/inet.h>  // 提供IP地址转换函数
#include <string.h>     // 提供字符串处理函数
#include <stdlib.h>     // 提供通用工具函数
#include <stdio.h>      // 提供输入输出函数
#include <unistd.h>     // 提供对POSIX操作系统API的访问功能

#define QUEUE 20        // 最大同时连接请求数
#define BUFFER_SIZE 1024 // 缓冲区大小

int main()
{
    // 创建socket,指定IPv4协议族,流式socket
    int sock_cli = socket(AF_INET, SOCK_STREAM, 0);

    // 定义服务器地址结构
    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr)); // 初始化地址结构
    servaddr.sin_family = AF_INET; // 地址族
    servaddr.sin_port = htons(8887); // 端口号,使用htons进行字节序转换
    servaddr.sin_addr.s_addr = inet_addr("192.168.138.133"); // 服务器IP地址

    // 连接服务器
    if(connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        perror("connect"); // 如果连接失败,打印错误信息
        exit(1); // 退出程序
    }

    char sendbuf[BUFFER_SIZE]; // 发送缓冲区
    char recvbuf[BUFFER_SIZE]; // 接收缓冲区

    // 数据交换循环
    while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
    {
        send(sock_cli, sendbuf, strlen(sendbuf), 0); // 发送数据
        if(strcmp(sendbuf, "exit\n") == 0) // 如果输入"exit"命令,则退出循环
            break;
        recv(sock_cli, recvbuf, sizeof(recvbuf), 0); // 接收数据
        fputs(recvbuf, stdout); // 将接收到的数据打印到标准输出

        memset(sendbuf, 0, sizeof(sendbuf)); // 清空发送缓冲区
        memset(recvbuf, 0, sizeof(recvbuf)); // 清空接收缓冲区
    }

    // 关闭socket
    close(sock_cli);

    return 0;
}

函数和参数解释

  • socket(int domain, int type, int protocol): 创建一个新的socket。

    • domain: 指定协议族,这里是AF_INET(IPv4网络协议)。
    • type: 指定socket类型,这里是SOCK_STREAM(提供顺序化、可靠、双向的基于连接的字节流)。
    • protocol: 指定具体协议,0表示自动选择type对应的默认协议,这里是TCP。
  • connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen): 请求连接到指定的socket。

    • sockfd: socket文件描述符。
    • addr: 指向目标主机地址信息的指针。
    • addrlen: 地址信息的长度。
  • send(int sockfd, const void *buf, size_t len, int flags): 发送数据。

    • sockfd: socket文件描述符。
    • buf: 指向数据缓冲区的指针。
    • len: 要发送的数据字节数。
    • flags: 传输控制标志,这里为0表示无特殊操作。
  • recv(int sockfd, void *buf, size_t len, int flags): 接收数据。

    • sockfd: socket文件描述符。
    • buf: 指向接收缓冲区的指针。
    • len: 缓冲区的长度。
    • flags: 传输控制标志,这里为0表示无特殊操作。

这段代码首先创建一个客户端的socket,然后连接到服务器的指定IP地址和端口上。一旦连接成功,客户端就会进入一个循环,从标准输入读取数据发送到服务器,并接收服务器的回应,直到输入"exit"命令为止。最后,关闭socket连接。

3. 编译并运行上述两个文件

3.1 编译

gcc TCP_server.c -o TCP_server
gcc TCP_client.c -o TCP_client

3.2 运行(启动两个终端,分别运行)

./TCP_server
./TCP_client

启动成功后,如图所示:
在这里插入图片描述

测试

在client端输入test
在这里插入图片描述
按下回车,可以看到,server端收到test
在这里插入图片描述

三、使用数据报协议UDP,实现数据报socket(SOCK_DGRAM)通信

1. 编写UDP_server.c

#include <sys/types.h> // 包含系统数据类型定义
#include <sys/socket.h> // 提供socket函数及相关数据结构
#include <netinet/in.h> // 包含IP地址和端口号数据结构
#include <arpa/inet.h> // 提供IP地址转换函数
#include <string.h> // 提供字符串处理函数
#include <stdlib.h> // 提供标准库函数
#include <sys/shm.h> // 提供共享内存相关函数
#include <stdio.h> // 提供输入输出函数
#include <fcntl.h> // 提供文件控制函数
#include <unistd.h> // 提供POSIX操作系统API

#define RECVLENTH 120 // 定义接收数据长度
#define SENDLENTH 120 // 定义发送数据长度

int main(int argc, char **argv)
{
    int sockefd = socket(AF_INET, SOCK_DGRAM, 0); // 创建一个UDP socket
    if(sockefd == -1)
    {
        perror("socket failed!"); // 输出错误信息
    }

    struct sockaddr_in saddr, caddr; // 定义服务器地址结构和客户端地址结构
    memset(&saddr, 0, sizeof(struct sockaddr_in)); // 初始化服务器地址结构
    saddr.sin_family = AF_INET; // 设置地址族为IPv4
    saddr.sin_port = htons(6666); // 设置端口号,使用htons进行字节序转换
    saddr.sin_addr.s_addr = inet_addr("192.168.138.133"); // 设置服务器IP地址

    int ret = bind(sockefd, (struct sockaddr*)&saddr, sizeof(struct sockaddr)); // 将socket绑定到服务器地址
    if(ret == -1)
    {
        perror("bind failed!"); // 输出错误信息
    }

    char buf[RECVLENTH]; // 定义接收数据的缓冲区
    memset(buf, 0, RECVLENTH); // 初始化接收缓冲区
    int size = sizeof(struct sockaddr); // 获取地址结构的长度
    recvfrom(sockefd, buf, RECVLENTH, 0, (struct sockaddr*)&caddr, &size); // 接收客户端发送的数据
    printf("[server recv]:%s\n", buf); // 打印接收到的数据

    char buf1[SENDLENTH] = {"hello client!"}; // 准备要发送的数据
    sendto(sockefd, buf1, strlen(buf1), 0, (struct sockaddr*)&caddr, sizeof(struct sockaddr)); // 发送数据给客户端

    close(sockefd); // 关闭socket连接

    return 0;
}

函数和参数解释

  • socket(AF_INET, SOCK_DGRAM, 0): 创建一个UDP socket。

    • AF_INET: 指定协议族为IPv4。
    • SOCK_DGRAM: 指定socket类型为数据报套接字,即UDP。
    • 0: 传输协议,这里为默认值。
  • bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen): 将socket绑定到特定地址。

    • sockfd: socket文件描述符。
    • addr: 指向要绑定的地址结构的指针。
    • addrlen: 地址结构的长度。
  • recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen): 接收数据报。

    • sockfd: socket文件描述符。
    • buf: 接收数据的缓冲区。
    • len: 缓冲区长度。
    • flags: 接收标志,这里为0表示无特殊操作。
    • src_addr: 指向发送方地址结构的指针。
    • addrlen: 地址结构的长度。
  • sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen): 发送数据报。

    • sockfd: socket文件描述符。
    • buf: 要发送的数据。
    • len: 数据长度。
    • flags: 发送标志,这里为0表示无特殊操作。
    • dest_addr: 指向目标地址结构的指针。
    • addrlen: 地址结构的长度。

这段代码创建了一个UDP服务器端,绑定到特定地址和端口上。它接收来自客户端的数据报,然后回显"hello client!"给客户端,并关闭连接。

2.编写UDP_client.c

#include <sys/types.h> // 包含系统数据类型定义
#include <sys/socket.h> // 提供socket函数及相关数据结构
#include <netinet/in.h> // 包含IP地址和端口号数据结构
#include <arpa/inet.h> // 提供IP地址转换函数
#include <string.h> // 提供字符串处理函数
#include <stdlib.h> // 提供标准库函数
#include <sys/shm.h> // 提供共享内存相关函数
#include <stdio.h> // 提供输入输出函数
#include <fcntl.h> // 提供文件控制函数
#include <unistd.h> // 提供POSIX操作系统API

#define RECVLENTH 120 // 定义接收数据的缓冲区大小
#define SENDLENTH 120 // 定义发送数据的缓冲区大小

int main(int argc, char **argv) // 主函数入口,接收命令行参数
{
    int sockefd = socket(AF_INET, SOCK_DGRAM, 0); // 创建一个UDP socket
    if (sockefd == -1) // 检查socket是否创建成功
    {
        perror("socket failed!"); // 输出错误信息
    }

    struct sockaddr_in saddr, caddr; // 定义服务器地址结构和客户端地址结构
    memset(&saddr, 0, sizeof(struct sockaddr_in)); // 初始化服务器地址结构
    saddr.sin_family = AF_INET; // 设置地址族为IPv4
    saddr.sin_port = htons(6666); // 设置端口号,使用htons进行字节序转换
    saddr.sin_addr.s_addr = inet_addr("192.168.138.133"); // 设置服务器IP地址

    char buf[SENDLENTH] = "hello server"; // 准备要发送的数据
    sendto(sockefd, buf, strlen(buf), 0, (struct sockaddr*)&saddr, sizeof(struct sockaddr)); // 发送数据给服务器

    char buf1[RECVLENTH]; // 定义接收数据的缓冲区
    memset(buf1, 0, RECVLENTH); // 初始化接收缓冲区
    int size = sizeof(struct sockaddr); // 获取地址结构的长度
    recvfrom(sockefd, buf1, RECVLENTH, 0, (struct sockaddr*)&caddr, &size); // 接收服务器发送的数据
    printf("[client recv]:%s\n", buf1); // 打印接收到的数据

    close(sockefd); // 关闭socket连接

    return 0; // 返回程序执行成功
}

函数和参数解释

  • socket(AF_INET, SOCK_DGRAM, 0): 创建一个UDP socket。

    • AF_INET: 指定协议族为IPv4。
    • SOCK_DGRAM: 指定socket类型为数据报套接字,即UDP。
    • 0: 传输协议,这里为默认值。
  • bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen): 将socket绑定到特定地址。

    • sockfd: socket文件描述符。
    • addr: 指向要绑定的地址结构的指针。
    • addrlen: 地址结构的长度。
  • recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen): 接收数据报。

    • sockfd: socket文件描述符。
    • buf: 接收数据的缓冲区。
    • len: 缓冲区长度。
    • flags: 接收标志,这里为0表示无特殊操作。
    • src_addr: 指向发送方地址结构的指针。
    • addrlen: 地址结构的长度。
  • sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen): 发送数据报。

    • sockfd: socket文件描述符。
    • buf: 要发送的数据。
    • len: 数据长度。
    • flags: 发送标志,这里为0表示无特殊操作。
    • dest_addr: 指向目标地址结构的指针。
    • addrlen: 地址结构的长度。

这段代码创建了一个UDP客户端,向特定地址和端口发送"hello server",然后接收服务器端回复的数据并打印出来。

3.编译运行及测试,参考TCP即可





转载请注明出处
作者:BQ
主页:https://blog.csdn.net/weixin_52677672?type=blog
QQ群:958124241
Learn Together!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2107931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TVS汽车级 二极管SZESD9B5.0ST5G你了解多少?专为汽车电子系统设计的瞬态电压抑制二极管

SZESD9B5.0ST5G功能特性分析&#xff1a; SZESD9B5.0ST5G用于保护电压敏感型ESD组件。优异的关断能力&#xff0c;低泄漏&#xff0c;快速响应时间为以下设计提供一流的 ESD 保护。由于体积小&#xff0c;适合在手机、MP3播放器、数码相机和许多其他便携式设备板空间非常宝贵的…

2024高教社杯数学建模竞赛解题思路

高教社杯数学建模竞赛解题思路&#xff1a;独家出版&#xff0c;思路解析模型代码结果可视化。 A题思路及程序链接&#xff1a;https://mbd.pub/o/bread/ZpqblJZs B题思路及程序链接&#xff1a;https://mbd.pub/o/bread/ZpqblJZx D题思路及程序链接&#xff1a;https://mbd.pu…

制造业中工艺路线(工序)与产线(工作中心)关系

一.工艺路线与生产线是数字孪生中的虚实关系&#xff1a; 1.工艺路线为虚&#xff0c;生产线体为实&#xff1b; 2.工艺路线指导生产线的生产组织&#xff0c;生产线承载工艺路线的能力&#xff0c;把虚拟的生产信息流变成真实的产流。 二.工艺路线与生产线是数字孪生中互为“…

nginx中如何设置gzip

前言 Nginx通过配置gzip压缩可以提升网站整体速度 Nginx的gzip功能是用于压缩HTTP响应内容的功能。当启用gzip时&#xff0c;在发送给客户端之前&#xff0c;Nginx会将响应内容压缩以减小其大小。这样可以减少数据传输的带宽消耗和响应时间&#xff0c;提高网站的性能和速度。…

2024 数学建模高教社杯 国赛(C题)| 农作物的种植策略 | 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;运用等多目标规划等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&#xff0c;我们出发…

2024 年高教社杯全国大学生数学建模竞赛题目-A 题 “板凳龙” 闹元宵

“板凳龙”&#xff0c;又称“盘龙”&#xff0c;是浙闽地区的传统地方民俗文化活动。人们将少则几十条&#xff0c; 多则上百条的板凳首尾相连&#xff0c;形成蜿蜒曲折的板凳龙。盘龙时&#xff0c;龙头在前领头&#xff0c;龙身和龙尾 相随盘旋&#xff0c;整体呈圆盘状。一…

干货分享|分享一款免费开源的动态壁纸软件 Lively Wallpaper

1.软件特点&#xff1a; 1&#xff09;这款软件拥有多种主题和风格的动态壁纸供你选择&#xff0c;包括自然风景、抽象艺术、动漫角色等。你可以根据个人喜好选择并自定义动态效果&#xff0c;如旋转、缩放、滚动等&#xff0c;让壁纸与你的电脑使用习惯相得益彰。 2&#xf…

【2024数模国赛赛题思路公开】国赛C题思路丨附可运行代码丨无偿自提

2024年国赛C题解题思路 C 题 农作物的种植策略 根据乡村的实际情况&#xff0c;充分利用有限的耕地资源&#xff0c;因地制宜&#xff0c;发展有机种植产业&#xff0c;对乡村经济的可持续发展具有重要的现实意义。选择适宜的农作物&#xff0c;优化种植策略&#xff0c;有利…

Word封面对齐技巧

文章目录 前言一、对齐封面1. 点击视图,添加标尺2. 选中文字,右击段落3. 点击制表符,设置制表位位置4. 鼠标点击“:”后面,点击“Tab”键5. 按住“Ctrl”键,选中没对齐的文字,点击“中文板式”,调整宽度6. 最终效果前言 本章使用的软件是WPS2019,简单介绍Word使用中封…

2024高教社杯全国大学生数学建模竞赛E题保姆级分析完整思路+代码+数据教学

2024高教社杯全国大学生数学建模竞赛E题保姆级分析完整思路代码数据教学 E题题目&#xff1a;交通流量管控 这道题目涉及一个拥有知名景区的小镇及其周边的道路交通管理问题。题目给出了一个现实中的交通场景&#xff0c;要求参赛者根据数据和交通模型&#xff0c;分析交通流量…

Axure制作圆球在区域范围内移动效果的案例

在Axure RP中&#xff0c;我们可以通过设置多个交互动作和动态面板来创建复杂的动画效果&#xff0c;比如实现一个圆球在指定区域内通过八个方向按钮控制移动的效果。以下是一个详细的步骤介绍&#xff0c;帮助你理解并制作这一效果。 预览&#xff1a; https://1zvcwx.axshare…

从被动防御到主动出击,揭秘云下一代防火墙的四大必杀技

在现代企业的网络架构中&#xff0c;边界防火墙作为第一道坚不可摧的防线&#xff0c;扮演着至关重要的角色。它不仅严格监控并过滤进出网络的数据流&#xff0c;有效阻止潜在的网络攻击、恶意软件和未经授权的访问&#xff0c;还根据企业安全策略智能地管理数据包的流向&#…

计算机毕设选题推荐-基于python的剧本杀预约服务平台【python-爬虫-大数据定制】

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的剧本杀预约服务…

如何撰写SCI作者同意发表函/版权转让协议

在发表SCI论文过程中&#xff0c;有些期刊需要作者提交稿件的时候提供作者同意发表函/版权转让协议。很多期刊是在投稿系统里面就可以选择同意发表&#xff0c;或者提供模板让作者填写。但是也有期刊没提供这些。如何撰写SCI作者同意发表函/版权转让协议呢&#xff1f;附件是Sp…

哈工大机试试题合集

&#x1f370;&#x1f370;&#x1f370;hello宝子们&#xff0c;今天我们来练习哈尔滨工业大学的机试题目。加油&#xff01;fighting&#xff01;( •̀ ω •́ )✧ &#x1f369;1355 素数判定 #include<bits/stdc.h> using namespace std; bool prime(long long x)…

BUUCTF PWN wp--bjdctf_2020_babystack

第一步 checksec一下&#xff0c;该题是64位的&#xff0c;该题目大概率是一道栈溢出&#xff08;因为题目里面提到了stack&#xff09; 分析一下这个二进制保护机制&#xff1a; Arch: amd64-64-little 这表示二进制文件是为64位AMD处理器设计的&#xff0c;使用的是小端序…

NTC阻值与温度计算公式

float Resistance_To_Temperature(float Res,float Res_Base) {/*NTC热敏电阻的温度计算涉及到特定的公式和一些关键参数。首先&#xff0c;需要了解NTC热敏电阻的阻值与其所处温度之间的关系。这种关系通常可以通过以下公式表示&#xff1a;Rt R * EXP(B * (1/T1 - 1/T2))其中…

Learn ComputeShader 07 Post Processing

这次我们将使用计算机着色器对图像进行后处理。 要进行后处理需要将渲染图像从cpu传递给gpu&#xff0c;并在gpu对图像进行处理然后传回cpu。 首先创建一个后处理基类BasePP 首先声明需要用到的属性。 using System.Collections; using System.Collections.Generic; using …

水滴型粉碎机:轻松粉碎辣椒,小型粉碎设备之选

水滴型粉碎机有效优化了物料流动路径&#xff0c;减少了物料在粉碎过程中的阻力与死角&#xff0c;从而大幅提升了粉碎效率与均匀度。同时&#xff0c;不一样的结构还增强了设备的耐磨性和稳定性&#xff0c;延长了使用寿命&#xff0c;降低了维护成本。 粉碎机采用的粉碎技术…

【C++ 第二十章】模拟实现 shared_ptr(可以拷贝的智能指针)

本文主要讲解如果简单模拟实现库中的 shared_ptr 而不会过多的对库中的 shared_ptr 讲解 1. 初始版本 智能指针的基本框架 namespace my {template<class T>class shared_ptr{public:shared_ptr(T* ptr nullptr):_ptr(ptr){}~shared_ptr() {delete _ptr;_ptr nullptr…