学习记录——day30 网络编程 端口号port 套接字socket TCP实现网络通信

目录

一、端口号 port

二、套接字 socket

1、原理

2、socket函数介绍

三、TCP实现网络通信

1、原理

2、TCP通信原理图

3、TCP相关函数

1)bind 绑定

2)listen  监听

 3)accept 接收连接请求

 4)recv 接收

5)send 发送

 6)connect 连接请求

4、TCP服务器端代码实现

 5、TCP客服端代码实现

四、UDP实现网络通信

1、UDP网络通信模型

 2、UDP相关函数 recvfrom sendto

3、UDP服务器端代码实现

4、UDP客服端端代码实现

五、TCP和UDP基础通信模型注意事项


一、端口号 port

1、为了区分同一主机上的多个进程,使用端口号来进行处理

2、端口号是一个2字节的无符号整数存储,取值范围【0,65535】

3、网络通信中两个“地址”,主机的地址——IP,进程的地址——端口号;

4、特殊的端口号:0-1023     

        由系统默认应用程序占用,编程不可使用

TCP 21端口:FTP文件传输服务
TCP 23端口:TELNET终端仿真服务
TCP 25端口:SMTP简单邮件传输服务
TCP 110端口:POP3邮局协议版本3
TCP 80端口:HTTP超文本传输服务
TCP 443端口:HTTPS加密超文本传输服务
UDP 53端口:DNS域名解析服务
UDP 69端口:TFTP文件传输服务

特殊的端口函数,存储在linux中的 /etc/services文件中

5、编程可使用的:1024-49151   

        编程可使用的端口号

6、临时端口号:49152-65535

        客服端运行时动态选择的,编程时若未指定端口号,会分配临时端口号

二、套接字 socket

        相关帮助指令     man 2 socket     man 7 socket

1、原理

2、socket函数介绍

       #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int socket(int domain, int type, int protocol);功能:为通信创建一个端点,并返回该端点的文件描述符参数1:通信域Name                Purpose                          Man pageAF_UNIX, AF_LOCAL   本地通信,同一主机之间进程通信     详情请看man 7 unixAF_INET             IPv4 提供的网络通信               详情请看man 7 ipAF_INET6            IPv6 提供的网络通信               详情请看man 7 ipv6参数2:指定通信语义,可以由多个宏值使用位或连接SOCK_STREAM:表示提供TCP协议的传输方式SOCK_DGRAM:表示提供UDP协议的传输方式SOCK_NONBLOCK:套接字设置非阻塞属性参数3:如果参数2中仅仅指定一个协议,那么参数3可以填0,如果指定多个,则参数3需要指定特定的协议TCP协议名称:IPPROTO_TCPUDP协议名称:IPPROTO_UDP返回值:成功返回创建的套接字文件描述符,失败返回     -1并置位错误码                 

三、TCP实现网络通信

1、原理

服务器端:

                1)创建套接字1

                2)给套接字1绑定服务器端端口号、ip地址

                3)将套接字1的功能改为监听(套接字内部被改造,原本的收发缓冲区改为已连接、未连接队列),用于检测是否客服端连接(三次握手就发生在这一步)

                4)阻塞等待连接,连接成功,创建套接字2,用于消息的收发

                5)消息的发送与接收

                6)关闭通信,可以由服务器端、客服端其中之一执行

客服端:

                1)创建由于通信的套接字

                2)绑定客服端端口号、ip地址

                3)连接服务器端,连接成功进入未连接队列,马上从未连接队列向已连接队列转换,该过程非常迅速,但同时申请连接的数量过多(超过未连接队列大小)仍会阻塞

                4)消息的发送与接收

                5)关闭通信,可以由服务器端、客服端其中之一执行

2、TCP通信原理图

3、TCP相关函数

1)bind 绑定

       #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:位套接字分配名称参数1:通过socket函数创建出来的套接字文件描述符参数2:通用地址信息结构体,需要根据具体使用的地址族而定, struct sockaddr仅仅只是为了类型的强制转换,防止出现警告跨主机间通信:man 7 ipstruct sockaddr_in {sa_family_t    sin_family; /* 表示通信域 */in_port_t      sin_port;   /* 端口号的网络字节序 */struct in_addr sin_addr;   /* ip地址 */};/* Internet address. */struct in_addr {uint32_t       s_addr;     /* IP地址的网络字节序 */};同一主机间通信:man 7 uninxstruct sockaddr_un {sa_family_t sun_family;               /* 表示通信域:AF_UNIX */char        sun_path[108];            /* 套接字文件的地址 */};参数3:参数2的大小返回值:成功返回0,失败返回-1并置位错误码注意关于bind的两个错误:1、 Cannot assign requested address:表示IP地址填写错误,检查IP是否有问题2、Address already in use:表示地址信息正在占用,可以调用函数快速重用,也可以等一会

2)listen  监听

       #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int listen(int sockfd, int backlog);功能:将套接字设置成被动监听状态,已接受客户端的连接请求参数1:套接字文件描述符参数2:容纳连接的队列的最大长度,一般填128返回值:成功返回0,失败返回-1并置为错误码

 3)accept 接收连接请求

       #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);功能:用于阻塞接收客户端连接请求参数1:服务器套接字文件描述符参数2:用于接收对端地址信息结构体的指针参数3:接收对端地址信息的长度返回值:成功返回一个新的用于通信的套接字文件描述符,失败返回-1并置位错误码

 4)recv 接收

       #include <sys/types.h>#include <sys/socket.h>ssize_t recv(int sockfd, void *buf, size_t len, int flags);功能:从套接字中读取数据到buf中参数1:用于通信的套接字文件描述符参数2:接收数据后的容器地址参数3:接收的数据的大小参数4:是否阻塞接收0:表示阻塞接收消息MSG_DONTWAIT:表示非阻塞接收数据返回值:>0:表示成功读取的字符个数=0:表示通信对端已经下线=-1:表示出错,置位错误码                    

5)send 发送

       #include <sys/types.h>#include <sys/socket.h>ssize_t send(int sockfd, const void *buf, size_t len, int flags);功能:向通信套接字文件描述符中写入数据参数1:通信的套接字文件描述符参数2:要发送数据的起始地址参数3:要发送数据的大小参数4:是否阻塞接收0:表示阻塞接收消息MSG_DONTWAIT:表示非阻塞接收数据返回值:成功返回发送字符的个数,失败返回-1并置位错误码       

 6)connect 连接请求

       #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:将套接字文件描述符连接到addr指向的地址空间中参数1:客户端套接字文件描述符参数2:对端地址信息结构体参数3:参数2的大小返回值:成功返回0,失败返回-1并置位错误码

4、TCP服务器端代码实现

#include <myhead.h>
#define SER_PORT 6666
#define SER_IP "192.168.232.129"
int main(int argc, char const *argv[])
{// 1、创建套接字int sfd = socket(AF_INET, SOCK_STREAM, 0);// 参数1:ipv4的网络通信// 参数2:TCP通信方式// 参数3:默认使用一个协议if (sfd == -1){perror("socket error");return -1;}printf("socket success, sfd = %d\n", sfd); // 3// 2、为套接字绑定ip地址和端口号// 2.1 填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;                // 通信域sin.sin_port = htons(SER_PORT);          // 端口号sin.sin_addr.s_addr = inet_addr(SER_IP); // ip地址// 2.2 绑定if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success\n");// 3、将套接字设置为被动监听状态,用于接收if (listen(sfd, 128) == -1){perror("listen error");return -1;}printf("listen success\n");// 4、阻塞等待客户端的连接请求// 4.1 定义n变量用于e接收客服端的信息struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);// 4.2 接收连接int newsfd = accept(sfd, (struct sockaddr *)&cin, &addrlen);if (newsfd == -1){perror("accept error");return -1;}printf("[%s:%d]:accept on\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));//5、数据收发char buf[128] = "";while (1){// 从客户端套接字中接收数据int res = recv(newsfd, buf, sizeof(buf),0);if (res == -1){perror("read error");return -1;}else if (res == 0){printf("客户端已下线\n");close(newsfd); // 关闭客户端套接字break;}// 接收数据printf("[%s:%d]:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);// 对接收到的数据进行处理strcat(buf, ":D");// 将消息返回到客户端if (send(newsfd, buf, strlen(buf),0) == -1){perror("发送失败\n");return -1;}printf("发送成功\n");bzero(buf,sizeof(buf));//清空容器}return 0;
}

 5、TCP客服端代码实现

#include <myhead.h>
#define SER_PORT 6666            // 与服务器保持一致
#define SER_IP "192.168.232.129" // 服务器ip地址
#define CLI_PORT 8888            // 客服端端口号
#define CLI_IP "192.168.232.129" // 客服端ip地址
int main(int argc, char const *argv[])
{//1、 创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if (cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd);//2、 绑定IP地址和端口号struct sockaddr_in cin;cin.sin_family = AF_INET;                // 通信域cin.sin_port = htons(CLI_PORT);          // 端口号cin.sin_addr.s_addr = inet_addr(CLI_IP); // ip地址//2.2、 绑定if (bind(cfd, (struct sockaddr *)&cin, sizeof(cin)) == -1){perror("bind error");return -1;}printf("bind success\n");//3、 连接服务器//3.1、 填充服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET; //通信域sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);//3.2、连接服务器if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");//4、数据收发char buf[128] = "";while (1){printf("输入:");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;//将数据发送到服务器send(cfd,buf,strlen(buf),0);printf("发送结束\n");//接收服务器发送的数据bzero(buf,sizeof(buf));//清空容器recv(cfd,buf,sizeof(buf),0);printf("收到服务器信息:%s\n",buf);}//5、关闭套接字close(cfd);return 0;
}

四、UDP实现网络通信

1、UDP网络通信模型

 2、UDP相关函数 recvfrom sendto

       ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);//功能:从套接字文件描述符中读取数据,并将对端地址信息结构体接收参数1:套接字文件描述符参数2:要接收数据的起始地址参数3:要接收的数据大小参数4:是否阻塞,0表示阻塞,MSG_NOWAIT表示非阻塞参数5:接收对端地址信息结构体参数6:参数5的大小返回值:成功返回读取的字节的大小,失败返回-1并置位错误码ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);//功能:向套接字文件描述符中读取数据,写给指定的对端接收参数1:套接字文件描述符参数2:要发送数据的起始地址参数3:要发送的数据大小参数4:是否阻塞,0表示阻塞,MSG_NOWAIT表示非阻塞参数5:接收对端地址信息结构体参数6:参数5的大小返回值:成功返回发送的字节的大小,失败返回-1并置位错误码

3、UDP服务器端代码实现

#include <myhead.h>
#define SER_PORT 9999            // 服务器端口号
#define SER_IP "192.168.232.129" // 服务器ip地址
int main(int argc, char const *argv[])
{// 1、创建用于通信的套接字i文件描述符int sfd = socket(AF_INET, SOCK_DGRAM, 0);if (sfd == -1){perror("scoket error");return -1;}printf("sfd = %d\n", sfd); // 3// 2、绑定ip地址和端口号//  2.1 填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;                // 通信域sin.sin_port = htons(SER_PORT);          // 端口号sin.sin_addr.s_addr = inet_addr(SER_IP); // ip地址// 2.2、 绑定if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success\n");// 3、数据收发char buf[128] = "";struct sockaddr_in cin;          // 接收对端地址信息socklen_t addrlen = sizeof(cin); // 接收地址长度while (1){// 清空容器bzero(buf, sizeof(buf));// 从套接字中读取数据recvfrom(sfd, buf, sizeof(buf), 0,(struct sockaddr*)&cin,&addrlen);printf("收到信息:%s\n", buf);// 处理收到的信息strcat(buf, ":(");if (sendto(sfd, buf, sizeof(buf), 0,(struct sockaddr*)&cin,sizeof(cin)) == -1){perror("send error");return -1;}printf("发送成功\n");}// 4、关闭文件描述符close(sfd);return 0;
}

4、UDP客服端端代码实现

#include <myhead.h>
#define SER_PORT 9999            // 与服务器保持一致
#define SER_IP "192.168.232.129" // 服务器ip地址
#define CLI_PORT 5555            // 客服端端口号
#define CLI_IP "192.168.232.129" // 客服端ip地址
int main(int argc, char const *argv[])
{// 1、 创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if (cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd);// 2、 绑定IP地址和端口号struct sockaddr_in cin;cin.sin_family = AF_INET;                // 通信域cin.sin_port = htons(CLI_PORT);          // 端口号cin.sin_addr.s_addr = inet_addr(CLI_IP); // ip地址// 2.2、 绑定if (bind(cfd, (struct sockaddr *)&cin, sizeof(cin)) == -1){perror("bind error");return -1;}printf("bind success\n");// 3、数据收发char buf[128] = "";// 3.1 填充服务器地址信息结构体struct sockaddr_in sin;                  // 接收对端地址信息sin.sin_family = AF_INET;                // 服务器的通信域sin.sin_port = htons(SER_PORT);          // 服务器的端口号sin.sin_addr.s_addr = inet_addr(SER_IP); // 服务器的ip地址while (1){printf("输入:");fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = 0;sendto(cfd, buf, strlen(buf), 0, (struct sockaddr *)&sin, sizeof(sin));printf("发送成功\n");bzero(buf, sizeof(buf));recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);printf("收到服务器信息:%s\n", buf);}// 4、关闭套接字close(cfd);return 0;
}

五、TCP和UDP基础通信模型注意事项

1、无论时TCP还是UDP通信中,服务器必须绑定ip地址和端口号,以便于让客服端找到该服务器。对于客服端而言,ip地址和端口号可以不绑定,若不绑定,端口号由系统动态分配(49152-65535)

2、对于TCP通信而言,可以使用recv和send进行通信,也可以使用read、write进行通信,还可以使用sendto和recvfrom进行通信

3、对于UDP通信而言,如果当前端只是用于接收数据,不发送数据,可以使用recvfrom、recv、read进行接收;如果当前端接收数据后还要发送数据给对端,则需要使用recvfrom进行接收数据,以便接收对端地址信息结构体

4、UDP通信中,服务器端可以使用connect函数与指定的客服端建立一个唯一的通道,在解除这种连接前,其他客服端与服务器端间不能通信。可通过将与服务器端建立连接的那个客服端的地址消息结构体中的sin.family设置未 AF_UNSPEC, 后再次使用connect函数断开连接

        UDP中通信使用connect连接的好处:

                1)提高信息传输效率、完整度

                例如:A和B同时向服务器发送消息,但是A发送的消息较大,需要较长的时间,发送过程中可能会出现时间片用完,服务器转而接收B的消息的情况,这会导致消息混乱。这时就可以先单独跟A建立连接,等所有数据传输结束后,再跟B通信

                2)传输性能高

        一般的UDP通信:获取对端地址信息 -->将信息加载到内核 -->数据收发--->获取对端地址信息 -->将信息加载到内核 --->数据收发 --->获取对端地址信息 -->将信息加载到内核 -->数据收发 -->......

        会经历多次用户空间到内核空间的转换,该过程对于cpu而言是一个漫长的过程

        UDP建立连接后:获取对端地址信息 ->将信息加载到内核 ->数据收发 ->数据收发 >数据收发 >数据收发完成>进行其他对端的信息处理.....

        会有效的减少用户空间到内核空间的转换次数

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

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

相关文章

Ubuntu系统中安装ffmpeg工具(详细图文教程)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

RAG:系统评估,以RAGAS为例

面试的时候经常会问到&#xff0c;模型和系统是怎么评估的&#xff0c;尤其是RAG&#xff0c;这么多组件&#xff0c;还有端到端&#xff0c;每部分有哪些指标评估&#xff0c;怎么实现的。今天整理下 目前最通用的是RAGAS框架&#xff0c;已经在langchain集成了。在看它之前&…

Java面试--设计模式

设计模式 目录 设计模式1.单例模式&#xff1f;2.代理模式&#xff1f;3.策略模式&#xff1f;4.工厂模式&#xff1f; 1.单例模式&#xff1f; 单例模式是Java的一种设计思想&#xff0c;用此模式下&#xff0c;某个对象在jvm只允许有一个实例&#xff0c;防止这个对象多次引…

文本分类任务算法演变(一)

文本分类任务算法演变 1.简介和应用场景1.1使用场景-打标签1.2使用场景-电商评论分析1.3使用场景-违规检测1.4使用场景-放开想象空间 2贝叶斯算法2.1预备知识-全概率公式2.2贝叶斯公式2.3文本分类中的应用2.3.1任务如下 2.4贝叶斯的优缺点 3.支持向量机3.1支持向量机-决策函数3…

libnl教程(2):发送请求

文章目录 前言示例示例代码构造请求创建套接字发送请求 简化示例 前言 前置阅读要求&#xff1a;libnl教程(1):订阅内核的netlink广播通知 本文介绍&#xff0c;libnl如何向内核发送请求。这包含三个部分&#xff1a;构建请求&#xff1b;创建套接字&#xff1b;发送请求。 …

Web开发:web服务器-Nginx的基础介绍(含AI文稿)

目录 一、Nginx的功能&#xff1a; 二、正向代理和反向代理的区别 三、Nginx负载均衡的主要功能 四、nginx安装目录下的各个文件&#xff08;夹&#xff09;的作用&#xff1a; 五、常用命令 一、Nginx的功能&#xff1a; 1.反向代理&#xff1a;例如我有三台服务器&#x…

大数据项目——实战项目:广告数仓(第二部分)集群环境部署

目录 第4章 广告数仓架构设计 第5章 集群环境准备 5.1 服务器准备 5.1.1 创建3台虚拟机 5.1.2 SSH无密登录配置 5.1.3 编写集群分发脚本xsync 5.1.4 JDK准备 5.1.5 环境变量配置说明 5.2 Hadoop部署 5.2.1 完全分布式运行模式&#xff08;开发重点&#xff09; 5.2…

去噪、梯度与边缘检测

图像噪点消除 噪声在图像处理中指的是图像中出现的干扰因素&#xff0c;通常由采集设备或传输过程引起。噪声使得图像的亮度变得不均匀或引入了随机的干扰点。常见的噪声类型包括&#xff1a; 高斯噪声&#xff1a;符合正态分布的噪声&#xff0c;会使图像变得模糊或出现噪点。…

Java基础之switch分支语句

switch分支语句 ​ switch语句也称为分支语句&#xff0c;其和if语句有点类似&#xff0c;都是用来判断值是否相等&#xff0c;但switch默认只支持byte、short、int、char这四种类型的比较&#xff0c;JDK8中也允许String类型的变量做对比。 语法&#xff1a; switch (表达式…

8.15 哈希表中等 139 Word Break review 467 Unique Substrings in Wraparound String

139 Word Break【逐一对比vs.多种 分割 组合】 片面思考的思路&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {//字符串和对应的字典&#xff0c;如果s种可以用空格分隔出一个或多个字典里的词就返回true//核心&#x…

windows 安装TVM

TVM支持在Windows环境下使用&#xff0c;但需要一些额外的配置。以下是如何在Windows Python环境中安装TVM的详细步骤。 1. 安装TVM的预备条件 在Windows上安装TVM之前&#xff0c;需要确保系统已经安装了以下工具和依赖项&#xff1a; Visual Studio: 安装包含C开发工具的V…

利用ZXing.Net Bindings for EmguCV识别条形码及绘制条形码边框17(C#)

上一篇博文&#xff1a;绘制条形码的效果不是很好&#xff1a;利用Emgucv绘制条形码边框16(C#)-CSDN博客 测试环境&#xff1a; win11 64位操作系统 visual studio 2022 ZXing.Net.Bindings.EmguCV 0.16.4 测试步骤如下&#xff1a; 1 新建.net framework 4.8的控制台项目…

Linux日常运维-主机名hosts

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 本小章内容就是Linux进阶部分的日常运维部分&#xff0c;掌握这些日常运维技巧或者方法在我们的日常运维过程中会带来很多方…

【Vue3】嵌套路由

【Vue3】嵌套路由 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内…

【Linux】缓冲区和文件系统

目录 一、缓冲区 1.1 概念 1.2 用户缓冲区和内核缓冲区 二、磁盘的结构 三、文件系统 3.1 初识“块”和inode 3.2 磁盘分区和文件系统 一、缓冲区 1.1 概念 要理解什么是缓冲区&#xff0c;先看这段代码 #include <stdio.h> #include <string.h> #includ…

Linux系统驱动(十八)SPI总线(未整理)

文章目录 一、SPI总线协议简介二、SPI子系统驱动&#xff08;二&#xff09;SPI子系统API&#xff08;三&#xff09;SPI设备树节点 三、代码示例 一、SPI总线协议简介 高速、同步、全双工、非差分、总线式 传输速度在几十M 差分总线和非差分总线 非差分总线&#xff1a;受压…

江协科技STM32学习笔记(第13章 WDG看门狗)

第13章 WDG看门狗 13.1 WDG看门狗 13.1.1 WDG简介 看门狗就是程序运行的一个保障措施&#xff0c;我们得在程序中定期地喂狗&#xff0c;如果程序卡死了&#xff0c;没有在规定的时间里喂狗&#xff0c;那么看门狗硬件电路就会自动帮我们复位一下&#xff0c;防止程序长时间…

最新爆火文生图模型FLUX

在AI图片生成领域&#xff0c;Flux模型的推出引起了广泛关注。随着AI技术的不断进步&#xff0c;新的模型层出不穷&#xff0c;而Flux正是其中的一颗新星。 Flux&#xff1a;一款迅速走红的AI图片生成模型 8月初&#xff0c;初创公司Black Forest Labs推出了文本生成图像模型…

米联客-FPGA程序设计Verilog语法入门篇连载-10 Verilog语法_一般设计规范

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本小节讲解Verilog语法的一般…

合并两个有序数组(LeetCode)

题目 给你两个按 非递减顺序 排列的整数数组 和 &#xff0c;另有两个整数 和 &#xff0c;分别表示 和 中的元素数目。请你 合并 到 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组不应由函数返回&#xff0c;而是…