Linux-网络编程

网络编程概述

本文将介绍网络编程中的一些基础知识,包括TCP和UDP的区别、端口号的作用、字节序的概念,以及通过socket编程实现客户端和服务器之间的通信。我们还会展示一些示例代码,帮助理解这些概念的实际应用。

1. TCP/UDP的区别,端口号的作用

1.1 TCP/UDP的区别

TCP(传输控制协议)UDP(用户数据报协议) 是互联网协议套件中的两个核心传输层协议。它们之间的主要区别如下:

  • 连接方式

    • TCP是面向连接的(如打电话要先拨号建立连接),需要在传输数据之前建立连接。
    • UDP是无连接的,即发送数据之前,不需要建立连接。
  • 可靠性

    • TCP提供可靠的服务,保证数据无差错、不丢失、不重复且按序到达。
    • UDP尽最大努力交付,不保证可靠交付。
  • 数据传输

    • TCP面向字节流,将数据视为一连串无结构的字节流。
    • UDP面向报文,支持面向报文的传输方式。
  • 通信方式

    • 每一条TCP连接只能是点到点的。
    • UDP支持一对一、一对多、多对一和多对多的交互通信。
  • 首部开销

    • TCP首部开销较大,为20字节。
    • UDP首部开销小,只有8字节。
  • 信道类型

    • TCP的逻辑通信信道是全双工的可靠信道。
    • UDP则是不可靠信道。

1.2 端口的作用

IP地址标识网络中的主机,但一台主机可以提供多个网络服务(如Web服务、FTP服务等)。为了区分不同的服务,使用“IP地址+端口号”来标识具体的服务。

  • 端口号 提供了访问通道。服务器通常通过知名端口号来识别。例如,FTP服务器的TCP端口号为21,Telnet服务器的TCP端口号为23,TFTP服务器的UDP端口号为69。

2. 字节序

  • 字节序 指的是多字节数据在内存中的存储顺序。常见的字节序有两种:大端字节序(Big-endian)和小端字节序(Little-endian)。
    • x86系列CPU通常采用小端字节序(Little-endian)。
    • 网络字节序通常采用大端字节序(Big-endian)。

3. Socket编程实现双方消息发送

3.1 Socket服务器实现不断接收客户端信息

通过Socket编程实现一个简单的服务器不断接收客户端信息,并处理数据。以下是一个简单的Socket服务器和客户端示例代码。

server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>int main(int argc, char **argv) {int s_fd;int c_fd;int n_read;char readBuf[128];char *msg = "I got your message";struct sockaddr_in s_addr;struct sockaddr_in c_addr;memset(&s_addr, 0, sizeof(struct sockaddr_in));memset(&c_addr, 0, sizeof(struct sockaddr_in));if (argc != 3) {printf("param isn't right\n");return -1;}// 1. 创建sockets_fd = socket(AF_INET, SOCK_STREAM, 0);if (s_fd == -1) {perror("socket");exit(-1);}s_addr.sin_family = AF_INET;s_addr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1], &s_addr.sin_addr);// 2. 绑定地址bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));// 3. 监听端口listen(s_fd, 10);// 4. 接受客户端连接int clen = sizeof(struct sockaddr_in);while (1) {c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &clen);if (c_fd == -1) {perror("accept");continue;}printf("get connect: %s\n", inet_ntoa(c_addr.sin_addr));if (fork() == 0) {// 5. 读取客户端数据n_read = read(c_fd, readBuf, 128);if (n_read == -1) {perror("read");} else {printf("get message: %d, %s\n", n_read, readBuf);}// 6. 发送响应write(c_fd, msg, strlen(msg));break; // 子进程完成一次后退出,父进程继续接收数据}}return 0;
}
client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>int main(int argc, char **argv) {int c_fd;int n_read;char readBuf[128];char *msg = "from client msg";struct sockaddr_in c_addr;memset(&c_addr, 0, sizeof(struct sockaddr_in));if (argc != 3) {printf("param isn't right\n");return -1;}// 1. 创建socketc_fd = socket(AF_INET, SOCK_STREAM, 0);if (c_fd == -1) {perror("socket");exit(-1);}c_addr.sin_family = AF_INET;c_addr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1], &c_addr.sin_addr);// 2. 连接服务器if (connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr_in)) == -1) {perror("connect");exit(-1);}// 3. 发送数据int n_write = write(c_fd, msg, strlen(msg));if (n_write == -1) {perror("write");}// 4. 读取响应n_read = read(c_fd, readBuf, 128);if (n_read == -1) {perror("read");} else {printf("get message from server: %d, %s\n", n_read, readBuf);}return 0;
}

4. 一个服务器对应一个客户端作双方交互信息

服务端创建子进程不断接收客户端数据,再创建一个子进程发送数据,做不同的事情;客户端创建子进程发送数据,父进程读取数据;一个进程一个while(1)

server.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>int main(int argc, char **argv) {int s_fd;int c_fd;int n_read;char readBuf[128];int mark = 0;char msg[128] = {0};struct sockaddr_in s_addr;struct sockaddr_in c_addr;memset(&s_addr, 0, sizeof(struct sockaddr_in));memset(&c_addr, 0, sizeof(struct sockaddr_in));if (argc != 3) {printf("param isn't right\n");return -1;}// 1. 创建sockets_fd = socket(AF_INET, SOCK_STREAM, 0);if (s_fd == -1) {perror("socket");exit(-1);}s_addr.sin_family = AF_INET;s_addr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1], &s_addr.sin_addr);// 2. 绑定地址bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));// 3. 监听端口listen(s_fd, 10);// 4. 接受客户端连接int clen = sizeof(struct sockaddr_in);while (1) {c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &clen);if (c_fd == -1) {perror("accept");continue;}printf("get connect: %s\n", inet_ntoa(c_addr.sin_addr));mark++;if (fork() == 0) {if (fork() == 0) {while (1) {// 6. 发送响应memset(msg, 0, sizeof(msg));sprintf(msg, "welcome %d client", mark);write(c_fd, msg, strlen(msg));sleep(3);}}// 5. 读取客户端数据while (1) {memset(readBuf, 0, sizeof(readBuf));n_read = read(c_fd, readBuf, 128);if (n_read == -1) {perror("read");} else {printf("\nget: %s\n", readBuf);}}break;}}return 0;
}

client.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>int main(int argc, char **argv) {int c_fd;int n_read;char readBuf[128];char msg[128] = {0};struct sockaddr_in c_addr;memset(&c_addr, 0, sizeof(struct sockaddr_in));if (argc != 3) {printf("param isn't right\n");return -1;}// 1. 创建socketc_fd = socket(AF_INET, SOCK_STREAM, 0);if (c_fd == -1) {perror("socket");exit(-1);}c_addr.sin_family = AF_INET;c_addr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1], &c_addr.sin_addr);// 2. 连接服务器if (connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr_in)) == -1) {perror("connect");exit(-1);}while (1) {if (fork() == 0) {while (1) {// 3. 发送数据memset(msg, 0, sizeof(msg));printf("input: ");gets(msg);write(c_fd, msg, strlen(msg));}}while (1) {// 4. 读取响应memset(readBuf, 0, sizeof(readBuf));n_read = read(c_fd, readBuf, 128);if (n_read == -1) {perror("read");} else {printf("\nget: %s\n", readBuf);}}}return 0;
}

5. 服务器与多个客户端聊天,服务器自动回复

server.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>int main(int argc, char **argv) {int s_fd;int c_fd;int n_read;int mark = 0;char buf[128] = {0};char msg[128] = {0};struct sockaddr_in s_addr;struct sockaddr_in c_addr;memset(&s_addr, 0, sizeof(struct sockaddr_in));memset(&c_addr, 0, sizeof(struct sockaddr_in));if (argc != 3) {printf("params no ok\n");exit(-1);}// 1. 创建sockets_fd = socket(AF_INET, SOCK_STREAM, 0);if (s_fd == -1) {perror("socket");exit(-1);}// 2. 绑定地址s_addr.sin_family = AF_INET;s_addr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1], &s_addr.sin_addr);bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));// 3. 监听端口listen(s_fd, 10);int len = sizeof(struct sockaddr_in);while (1) {// 4. 接受客户端连接c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &len);if (c_fd == -1) {perror("accept");continue;}mark++;printf("get connect: %s\n", inet_ntoa(c_addr.sin_addr));if (fork() == 0) {if (fork() == 0) {// 5. 发送自动回复消息while (1) {memset(msg, 0, sizeof(msg));sprintf(msg, "welcome No %d client", mark);write(c_fd, msg, strlen(msg));sleep(2);}}// 6. 读取客户端消息while (1) {memset(buf, 0, sizeof(buf));n_read = read(c_fd, buf, sizeof(buf));if (n_read == -1) {perror("read");} else {printf("read client: %s\n", buf);}}}}close(s_fd);return 0;
}

client.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>int main(int argc, char **argv) {int c_fd;int n_read;char buf[128] = {0};char msg[128] = {0};struct sockaddr_in c_addr;memset(&c_addr, 0, sizeof(struct sockaddr_in));if (argc != 3) {printf("params is no ok\n");exit(-1);}// 1. 创建socketc_fd = socket(AF_INET, SOCK_STREAM, 0);if (c_fd == -1) {perror("socket");exit(-1);}// 2. 绑定地址c_addr.sin_family = AF_INET;c_addr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1], &c_addr.sin_addr);// 3. 连接服务器if (connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr_in)) == -1) {perror("connect");exit(-1);}while (1) {if (fork() == 0) {while (1) {// 4. 发送消息memset(msg, 0, sizeof(msg));printf("input: ");gets(msg);write(c_fd, msg, strlen(msg));}}while (1) {// 5. 接收消息memset(buf, 0, sizeof(buf));n_read = read(c_fd, buf, sizeof(buf));if (n_read == -1) {perror("read");} else {printf("read server: %s\n", buf);}}}close(c_fd);return 0;
}

6. FTP云盘

FTP云盘功能实现,包含以下功能:

  • lls: 列出本地的文件
  • lcd: 进入本地的文件路径
  • cd: 进入服务端的路径
  • ls: 列出服务端的文件
  • quit: 退出客户端
  • get: 获取服务端的文件
  • put: 上传客户端的文件

server.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "config.h"int get_cmd_type(char *cmd) {if (strcmp("ls", cmd) == 0) return LS;if (strcmp("pwd", cmd) == 0) return PWD;if (strcmp("quit", cmd) == 0) return QUIT;if (strstr(cmd, "cd")) return CD;if (strstr(cmd, "get")) return GET;if (strstr(cmd, "put")) return PUT;return -1;
}char* getDir(char *cmd) {char *p = NULL;p = strtok(cmd, " ");p = strtok(NULL, " ");return p;
}void cmdHandler(struct MSG msg, int c_fd) {int ret;int fd;int p_fd;FILE *fp;char *filename = NULL;char *file = NULL;char *filename2 = NULL;char dataBuf[1024] = {0};printf("%s\n", msg.cmd);ret = get_cmd_type(msg.cmd);printf("ret=%d\n", ret);switch (ret) {case LS:case PWD:fp = popen(msg.cmd, "r");fread(msg.cmd, sizeof(msg.cmd), 1, fp);write(c_fd, &msg, sizeof(msg));break;case CD:filename = getDir(msg.cmd);printf("filename: %s\n", filename);chdir(filename);break;case GET:file = getDir(msg.cmd);if (access(file, F_OK) == -1) {strcpy(msg.cmd, "NO this file");write(c_fd, &msg, sizeof(msg));} else {msg.type = 8;fd = open(file, O_RDWR);read(fd, dataBuf, sizeof(dataBuf));close(fd);strcpy(msg.cmd, dataBuf);write(c_fd, &msg, sizeof(msg));printf("success\n");}break;case PUT:filename2 = getDir(msg.cmd);printf("filename: %s\n", filename2);p_fd = open(filename2, O_RDWR | O_CREAT, 0666);write(p_fd, msg.dataBuf, strlen(msg.dataBuf));printf("write success\n");close(p_fd);break;case QUIT:printf("client out\n");exit(-1);break;}
}int main(int argc, char **argv) {int s_fd;int c_fd;int n_read;struct sockaddr_in s_addr;struct sockaddr_in c_addr;struct MSG msg;memset(&s_addr, 0, sizeof(struct sockaddr_in));memset(&c_addr, 0, sizeof(struct sockaddr_in));if (argc != 3) {printf("params is no ok\n");exit(-1);}// 1. 创建sockets_fd = socket(AF_INET, SOCK_STREAM, 0);if (s_fd == -1) {perror("socket");exit(-1);}// 2. 绑定地址s_addr.sin_family = AF_INET;s_addr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1], &s_addr.sin_addr);bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));// 3. 监听端口listen(s_fd, 10);int len = sizeof(struct sockaddr_in);while (1) {// 4. 接受客户端连接c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &len);if (c_fd == -1) {perror("accept");continue;}printf("get connect: %s\n", inet_ntoa(c_addr.sin_addr));if (fork() == 0) {while (1) {memset(&msg.cmd, 0, sizeof(msg));n_read = read(c_fd, &msg, sizeof(msg));if (n_read == 0) {printf("client out");break;} else if (n_read > 0) {cmdHandler(msg, c_fd);}}}}close(s_fd);close(c_fd);return 0;
}

client.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "config.h"int get_cmd_type(char *cmd) {if (strcmp(cmd, "ls") == 0) return LS;if (strcmp(cmd, "pwd") == 0) return PWD;if (strcmp(cmd, "quit") == 0) return QUIT;if (strstr(cmd, "lcd")) return LCD;if (strstr(cmd, "cd")) return CD;if (strstr(cmd, "lls")) return LLS;if (strstr(cmd, "get")) return GET;if (strstr(cmd, "put")) return PUT;return -1;
}char* getDir(char *cmd) {char *p = NULL;p = strtok(cmd, " ");p = strtok(NULL, " ");return p;
}int cmd_handler(struct MSG msg, int c_fd) {int ret;int fd;char *filename = NULL;char *dir = NULL;char buf[32] = {0};ret = get_cmd_type(msg.cmd);switch (ret) {case LS:case PWD:case CD:case GET:write(c_fd, &msg, sizeof(msg));break;case LLS:system("ls");break;case LCD:filename = getDir(msg.cmd);printf("filename: %s\n", filename);chdir(filename);break;case PUT:strcpy(buf, msg.cmd);dir = getDir(buf);printf("dir: %s\n", dir);if (access(dir, F_OK) == -1) {printf("%s no exsit\n", dir);} else {fd = open(dir, O_RDWR);read(fd, msg.dataBuf, strlen(msg.dataBuf));close(fd);write(c_fd, &msg, sizeof(msg));printf("ok\n");}break;case QUIT:write(c_fd, &msg, sizeof(msg));close(c_fd);exit(-1);break;}return ret;
}void cmd_serverMsg_handler(struct MSG msg, int c_fd) {int n_read;int fd;char *file = NULL;struct MSG getmsg;n_read = read(c_fd, &getmsg, sizeof(getmsg));if (n_read == 0) {printf("server quit\n");}if (getmsg.type == 8) {file = getDir(msg.cmd);fd = open(file, O_RDWR | O_CREAT, 0600);printf("open success\n");write(fd, getmsg.cmd, strlen(getmsg.cmd));} else {printf("-------------------------------------\n");printf("%s\n", getmsg.cmd);printf("-------------------------------------\n");}
}int main(int argc, char **argv) {int c_fd;int ret;struct sockaddr_in c_addr;struct MSG msg;memset(&c_addr, 0, sizeof(struct sockaddr_in));if (argc != 3) {printf("params is no good\n");exit(-1);}// 1. 创建socketc_fd = socket(AF_INET, SOCK_STREAM, 0);if (c_fd == -1) {perror("socket");exit(-1);}// 2. 连接服务器c_addr.sin_family = AF_INET;c_addr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1], &c_addr.sin_addr);if (connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr_in)) == -1) {perror("connect");exit(-1);}printf("connect....\n");// 3. 处理命令while (1) {memset(msg.cmd, 0, sizeof(msg));gets(msg.cmd);ret = cmd_handler(msg, c_fd);if (ret == CD || ret == LLS || ret == LCD || ret == QUIT || ret == PUT) {continue;}if (ret == -1) {printf("this is command no exist\n");continue;}cmd_serverMsg_handler(msg, c_fd);}close(c_fd);return 0;
}

config.h

#define LS   0
#define PWD  1
#define CD   2
#define GET  3
#define PUT  4
#define LLS  5
#define LCD  6
#define QUIT 7struct MSG {int type;char cmd[1024];char dataBuf[1024];
};

通过上述代码示例,展示了如何通过socket编程实现客户端和服务器之间的通信,包括简单的消息传递、多客户端处理以及文件传输等功能。希望这些示例代码能帮助理解和应用网络编程中的一些基本概念和技术。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五种肉苁蓉属植物叶绿体基因组-文献精读25

Structural mutations of small single copy (SSC) region in the plastid genomes of five Cistanche species and inter-species identification 五种肉苁蓉属植物叶绿体基因组中小单拷贝 (SSC) 区域的结构突变及物种间鉴定 摘要 背景 肉苁蓉属是列当科的重要属类&#xf…

[SwiftUI 开发] 嵌套的ObservedObject中的更改不会更新UI

1. 发生问题的demo 业务逻辑代码 class Address: ObservableObject {Published var street "123 Apple Street"Published var city "Cupertino" }class User: ObservableObject {Published var name "Tim Cook"Published var address Addr…

嵌入式linux系统中动态链接库实现详解

大家好,linux系统中动态库是如何实现相互链接的?今天简单聊聊动态链接库的实现原理。 假设有这样两段代码,第一段代码定义了一个全量变量a以及函数foo,函数foo中引用了下一段代码中定义的全局变量b。 第二段代码定义了全局变量b以及main函数,同时在main函数中调用了第一个…

ZXL-2000砌体砂浆强度点荷仪

一、产品简介&#xff1a; 砌体砂浆强度点荷仪&#xff08;又名&#xff1a;砂浆点荷仪&#xff09;&#xff0c;是根据GB/T50315-2000《砌体工程现场检验技术规程》而研制生产的。是砌体砂浆强度检测的专用仪器&#xff0c;其特点是能在现场或试验室直接测试&#xff0c;不影…

最短路模型——AcWing 188. 武士风度的牛

最短路模型 定义 最短路模型是图论中的一个经典问题&#xff0c;旨在寻找从图中一个顶点到另一个顶点的路径&#xff0c;使得这条路径上的边&#xff08;或边的权重&#xff09;之和最小。这一模型在许多实际问题中有着广泛的应用&#xff0c;比如网络路由、地图导航、物流配…

【深度学习】图生图img3img论文原理,SD EDIT

https://arxiv.org/abs/2108.01073 摘要 引导图像合成技术使普通用户能够以最小的努力创建和编辑逼真的图像。关键挑战在于平衡对用户输入&#xff08;例如&#xff0c;手绘的彩色笔画&#xff09;的忠实度和合成图像的真实感。现有的基于GAN的方法试图通过使用条件GAN或GAN反…

面试相关-接口测试常问的问题

1.为什么要做接口测试 (1)现在大多系统都是前后端分离的项目,前端和后端的进度可能不一样,那为了尽早的进入测试,前端界面没有开发完成的情况下,只要后端的接口开发完了,就可以提前做接口测试了; (2)基于安全考虑,只依赖前端进行限制,已经完全不满足系统的安全性…

c++习题02-浮点数求余

目录 一&#xff0c;问题 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;问题 二&#xff0c;思路 虽然在浮点类型中没有取余的运算&#xff08;无法直接使用%符号取余&#xff09;&#xff0c;但是我们都知道在数学中&#xff0c;除法是减法的连续运算&#xff…

trie[讲课留档]

字典树 1.字典树简介 字典树 ( Trie 树 ) 又称单词查找树&#xff0c; 是一种用于在字符串集合中高效地存储和查找字符串的树形数据结构。 我们首先通过一张图来理解字典树的结构&#xff1a; 我们假定结点的顺序按照图中给定的顺序进行编号&#xff0c;容易发现&#xff0c…

Golang-slice理解

slice golang-slice语雀笔记整理 slicego为何设计slice&#xff1f;引用传递实现扩容机制 go为何设计slice&#xff1f; 切片对标其他语言的动态数组&#xff0c;底层通过数组实现&#xff0c;可以说是对数组的抽象&#xff0c;底层的内存是连续分配的所以效率高&#xff0c;可…

Spring Boot项目的两种发布方式

一、通过jar包发布 1、在pom中添加一个SpringBoot的构建的插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><!--自动检测项目中的 main 函数--><artifactId>spring-boot-maven-plugin</artifactId>…

一文get懂kwai短视频助力巴西博弈slots游戏广告优势

一文get懂kwai短视频助力巴西博弈slots游戏广告优势 在数字化时代&#xff0c;短视频广告凭借其独特的魅力和高效的传播方式&#xff0c;成为了各大品牌进行营销推广的重要手段。特别是在巴西这个充满活力的国家&#xff0c;kwai短视频广告以其独特的方式&#xff0c;为博弈游…

2024企业数据资产化及数据资产入表方案梳理

01 数据资产入表&#xff1a;是一个将组织的各类数据资产进行登记、分类、评估和管理的流程。 数据资产包括&#xff1a;客户信息、交易记录、产品数据、财务数据等。 做个比喻吧&#xff1a;数据资产入表就像是给公司的数据资产做“人口普查”—— ①找出公司有哪些数据找…

Pytorch课程论文设计参考

Pytorch下基于卷积神经网络的手写数字识别 论文格式 利用wps初步美化论文格式教程 wps论文格式变的的原因 格式变的根本原因是word为流式文件&#xff0c;就算同是word同一个版本不同电脑也会有可能变&#xff0c;字体变是因为没有嵌入字体然后观看的那台没有这个字体。 一、…

机器学习环境搭建

前言 个人笔记&#xff0c;记录框架和小问题&#xff0c;没有太详细记载。。 1、Anaconda安装 下载地址&#xff1a; Free Download | Anaconda &#xff08;慢&#xff09; ​ 国内镜像&#xff1a;https://link.csdn.net/?targethttp%3A%2F%2Fitcxy.xyz%2F241.html 下载…

【硬件开发】安规电容X电容和Y电容

为什么有安规电容 国家为了保护人民的安全要求&#xff0c;电容器失效后&#xff0c;不会导致电击&#xff0c;不危及人身安全的安全电容器 安规电容的作用 滤除雷电冲击波&#xff0c;以及插拔插座的高频噪声 X电容 聚酯电容 位置 X电容位于火线和零线之间 作用 滤除…

Bunny的PT+SFT训练

GitHub - BAAI-DCAI/Bunny: A family of lightweight multimodal models.A family of lightweight multimodal models. . Contribute to BAAI-DCAI/Bunny development by creating an account on GitHub.https://github.com/BAAI-DCAI/Bunny1.环境安装 conda create -n bunny …

观测云产品更新 | Pipelines、智能监控、日志数据访问等

观测云更新 Pipelines 1、Pipelines&#xff1a;支持选择中心 Pipeline 执行脚本。 2、付费计划与账单&#xff1a;新增中心 Pipeline 计费项&#xff0c;统计所有命中中心 Pipeline 处理的原始日志的数据大小。 监控 1、通知对象管理&#xff1a;新增权限控制。配置操作权…

经典小游戏(一)C实现——三子棋

switch(input){case 1:printf("三子棋\n");//这里先测试是否会执行成功break;case 0:printf("退出游戏\n");break;default :printf("选择错误&#xff0c;请重新选择!\n");break;}}while(input);//直到输入的结果为假&#xff0c;循环才会结束} …

springboot是否可以代替spring

Spring Boot不能直接代替Spring&#xff0c;但它是Spring框架的一个扩展和增强&#xff0c;提供了更加便捷和高效的开发体验。以下是关于Spring Boot和Spring关系的详细解释&#xff1a; Spring框架&#xff1a; Spring是一个广泛应用的开源Java框架&#xff0c;提供了一系列模…