Linux网络 UDP socket
背景知识
socketn.(电源 ) 插座; ( 电器上的 ) 插口,插孔,管座;槽;窝;托座;臼;孔穴vt.把… 装入插座;给 … 配插座

- 传输层协议
- 有连接
- 可靠传输
- 面向字节流
- 传输层协议
- 无连接
- 不可靠传输
- 面向数据报
sockaddr 结构
套接字有很多类型,主要分为以下几种
- Unix Socket域套接字:用于本地通信,通常用于同一台机器上的不同进程间通信。
- Inet Socket网络套接字:用于网络通信,支持多种协议,如TCP和UDP。
- Raw Socket原始套接字:用于网络管理和底层网络编程。
sockaddr
结构是在网络编程中用于表示套接字地址的通用数据结构, 它的作用是存储网络地址信息,供套接字函数使用,此时套接字函数就知道要对哪一台主机进行网络操作,它被设计为一个抽象层,允许应用程序通过同一接口处理不同类型的网络协议和地址族。
但是sockaddr
结构体不能直接存储 IPv4 或 IPv6 的地址信息,在实际使用中,通常会用到它的具体子类型,如 sockaddr_in
(用于 IPv4)和 sockaddr_in6
(用于 IPv6),sockaddr_un
(用于域套接)。
为了管理多种套接字,所有套接字的头部都是一个16位的地址类型,用于辨别这个结构体表示哪一个套接字。当操作sockaddr
的时候,读取前16位就知道这个sockaddr
具体是哪一种套接字,随后再进行类型转化,变成对应套接字类型的结构体,此时就能对具体的套接字做操作了。
sockaddr
结构体定义在 <sys/socket.h>
头文件中,其基本定义如下:
struct sockaddr {sa_family_t sin_family; /* 地址家族,AF_XXX */char sin_zero[14]; /* 填充字段,实际用途取决于具体的地址家族 */
};
其中,sin_family 字段用来指定协议族,即协议类型,常见的取值有 AF_INET(IPv4)、AF_INET6(IPv6)和 AF_UNIX(UNIX 域套接字)等。
其中最常用的就是 AF_INET 进行IPv4通信。其对应的具体结构体为struct sockaddr_in,定义如下:
struct sockaddr_in {sa_family_t sin_family; /* 协议族,AF_INET */uint16_t sin_port; /* TCP 或 UDP 端口号 */struct in_addr sin_addr; /* 32 位 IPv4 地址 */
};
此处有一个小细节,IPv4
的地址占32
位,用一个int
类型即可存储,sin_addr的类型却是struct in_addr,这其实是Linux
对其进行了额外的一层封装:
struct in_addr {uint32_t s_addr;
};
所以存储地址的时候,要用sockaddr_in.sin_addr.s_addr,此处嵌套了两层结构体。基于IP地址和端口号,此时就可以定位到全世界的一个主机上的一个具体进程,此时就可以进行后续的网络通信了。
bzero
我们知道struct sockaddr_in 的内部还有8字节填充,这是为了以确保struct sockaddr_in的大小与struct sockaddr一致,所以我们需要一开始时将其初始化为0。除此,创建结构体时分配到的内存原先有可能存储了其他数据,为了保证不被之前的数据影响,我们也要把整个结构体的内存全部置为0
。
所以我们可以使用bzero函数。
void bzero(void* s, size_t n);
s
:要初始化内存的地址n
:要初始化的字节数
示例如下
struct sockaddr_in socket;
bzero(&socket,sizeof(socket));
网络字节序(填sin_port)

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
struct sockaddr_in socket;
socket.sin_port=8080;//错误
socket.sin_port=htons(8080);//正确
IP地址转换(填sin_addr)
在给 struct sockaddr_in 结构体填入数据时,其IP地址 sin_addr 的格式也需要遵循特定的规则。我们知道,IP地址有两种基本格式,4字节序列,以及点分十进制,如果拿到的IP地址格式与自己所需的类型不符,此时就要考虑两种格式之间转化的问题了。
inet_addr函数用于将一个点分十进制的IP地址字符串转换为网络字节序的32位整数。
in_addr_t inet_addr(const char *cp);
参数cp是一个指向以点分十进制格式表示的IP地址字符串的指针,例如"127.0.0.1"。函数返回一个32位的无符号整数,表示转换后的IP地址。如果输入的字符串不是一个合法的IP地址,函数将返回INADDR_NONE,通常定义为-1。
示例如下
struct sockaddr_in socket;
socket.sin_addr.s_addr = inet_addr("127.0.0.1");
我们知道存入 struct sockaddr_in 中的数据必须是网络字节序,此处将点分十进制转化为四字节序列后,应该还需要转成网络字节序。的确如此,不过我们不需要手动转换,因为 inet_addr 函数已经帮我们完成转换。
inet_ntoa函数用于将一个网络字节序的32位整数IP地址转换为点分十进制的字符串格式。这个函数的原型如下
char *inet_ntoa(struct in_addr in);
参数in
是一个struct in_addr
类型的结构体,其中包含了一个32位的无符号整数,表示IP地址。inet_ntoa函数返回一个指向静态存储区的字符串,该字符串包含了以点分十进制格式表示的IP地址。由于返回的字符串存储在静态存储区,因此在多线程环境中可能会出现问题,因为后续的调用可能会覆盖之前的结果,所以在多线程环境下推荐使用ntop函数。
char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
参数:
af
:协议族,可以是AF_INET
(IPv4)或AF_INET6
(IPv6)。src
:指向要转换的网络字节序IP地址的指针。dst
:指向存储转换后字符串的缓冲区的指针。size
:缓冲区的大小。
返回值:成功时,返回指向dst
的非空指针。失败时,返回NULL
,并且可以通过errno
获取错误码。
综上,我们就有一个类型为 struct sockaddr_in 比较完整的初始化过程了:
struct sockaddr_in socket;
bzero(&socket,sizeof(socket));
socket.sin_family=AF_INET;
socket.sin_port=htons(8080);
socket.sin_addr.s_addr=inet_addr("127.0.0.1");
UDP socket
UDP(User Datagram Protocol)套接字是一种网络通信协议,它提供了一种无连接、不可靠的传输服务。UDP套接字通常用于需要快速传输和实时响应的应用场景,如在线游戏、视频会议和实时监控等。
UDP套接字的特点
- 无连接性:UDP不需要在发送数据之前建立连接,因此减少了通信延迟。
- 不可靠性:UDP不提供数据传输的可靠性保证,数据包可能会丢失或乱序到达。
- 面向数据报:UDP以数据报为单位进行传输,每个数据报都是独立的。
- 全双工:UDP支持双向通信,允许同时进行数据的发送和接收。
socket 创建套接字
socket
函数用于创建一个新的套接字,需要头文件<sys/types.h>
,<sys/socket.h>
,函数原型如下:
int socket(int domain, int type, int protocol);
参数:
domain
:指定协议族,对于UDP套接字,通常使用AF_INET
(IPv4)或者AF_INET6
(IPv6)。type
:指定套接字类型,创建UDP套接字时使用SOCK_DGRAM,DGRAM
为datagram
缩写,即数据报。protocol
:指定协议类型,一般设置为0,表示根据前面两个参数自动选择合适的协议(对于AF_INET
和SOCK_DGRAM
,会自动选择UDP协议)。
返回值:如果成功创建套接字,返回一个非负的套接字描述符,其本质也是一个文件描述符,后续对网络的操作就是对这个文件的操作。比如向网络中发送消息,其实就是向文件中写入数据;如果失败,返回 - 1,并设置errno
来指示错误类型。
使用示例如下
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
bind 绑定地址
当创建完套接字后,这个套接字还没有指定和哪一个主机通信,此时就需要IP地址和端口号,之前讲的sockaddr_in就派上用场了!bind函数用于给套接字绑定IP地址和端口号,指定和哪一台主机通信,函数原型如下:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:
sockfd
:由socket()
函数返回的套接字描述符。addr
:一个指向sockaddr
结构(或者sockaddr_in
对于IPv4或者sockaddr_in6
对于IPv6)的指针,包含了要绑定的地址和端口信息。addrlen
:是addr
所指向结构的长度。
返回值:如果绑定成功,返回0;如果失败,返回 - 1,并设置errno
来指示错误类型。
此处注意传入的是struct sockaddr *,所以sockaddr_in类型的变量传入的时候要进行类型转化。
//创建UDP套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);//初始化套接字要通信的目标主机地址
struct sockaddr_in socket;
bzero(&socket, sizeof(socket));
socket.sin_family = AF_INET;
socket.sin_port = htons(8080);
socket.sin_addr.s_addr = inet_addr("127.0.0.1");//绑定地址到套接字
bind(sockfd, (struct sockaddr*)&socket, sizeof(socket));
sendto 发送数据
sendto
函数用于发送数据报,函数原型如下:
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
参数:
sockfd
:是要发送数据的套接字描述符。buf
:是一个指向要发送数据的缓冲区的指针。len
:是要发送数据的长度(以字节为单位)。flags
:一般设置为0,或者可以使用一些特定的标志(如MSG_DONTWAIT
等)。dest_addr
:是一个指向sockaddr
结构(或者sockaddr_in
对于IPv4或者sockaddr_in6
对于IPv6)的指针,包含了目标地址和端口信息。addrlen
:是dest_addr
所指向结构的长度。
返回值:如果成功发送数据,返回实际发送的字节数;如果失败,返回 - 1,并设置errno
来指示错误类型。
//创建UDP套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);//初始化套接字要通信的目标主机地址
struct sockaddr_in socket;
bzero(&socket, sizeof(socket));
socket.sin_family = AF_INET;
socket.sin_port = htons(8080);
socket.sin_addr.s_addr = inet_addr("127.0.0.1");//给目标主机发送消息
const char* message = "hello";
sendto(sockfd,message,sizeof(message),(struct sockaddr*)&socket,sizeof(socket));
此处给地址为127.0.0.1端口为8080发送了一个报文,内容是”hello“。
我们可以看到以上代码中没有bind绑定地址,因为该操作已经由操作系统自动完成了,Linux会自动为其分配端口号,并完成绑定,随后通过随机分配的端口发送数据,这种行为称为隐式绑定。在实际开发中,一般服务端占用指定的端口,这样客户端才知道往哪一个端口发送请求,所以服务端要显式bind指定端口,不能让操作系统分配。而客户端往往不在意端口号,只需要能与服务端通信即可,所以客户端一般不bind,而是让系统随机分配一个端口。
recvfrom 接收数据
在Linux系统下,recvfrom
函数用于在UDP套接字上接收数据,其函数原型如下:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
参数:
sockfd
:是要接收数据的套接字描述符。buf
:是一个指向用于接收数据的缓冲区的指针。len
:是缓冲区的长度(以字节为单位)。flags
:一般设置为0,或者可以使用一些特定的标志(如MSG_DONTWAIT
等)。src_addr
:是一个指向sockaddr
结构(或者sockaddr_in
对于IPv4或者sockaddr_in6
对于IPv6)的指针,如果不为NULL
,则用于存储发送方的地址和端口信息。addrlen
:是一个指向socklen_t
类型的指针,如果src_addr
不为NULL
,则在函数调用前,*addrlen
应设置为src_addr
所指向结构的长度;函数返回时,*addrlen
被更新为实际存储发送方地址信息的结构的长度。
返回值:如果成功接收数据,返回实际接收的字节数;如果失败,返回 - 1,并设置errno
来指示错误类型。
使用示例
//创建UDP套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);//初始化套接字要通信的目标主机地址
struct sockaddr_in socket;
bzero(&socket, sizeof(socket));
socket.sin_family = AF_INET;
socket.sin_port = htons(8080);
socket.sin_addr.s_addr = inet_addr("127.0.0.1");//接收消息
struct sockaddr_in sendsock;
socklen_t len;
char* buf[1024];
recvfrom(sockfd,buf,sizeof(buf)-1,(struct sockaddr*)&sendsock,sizeof(len));
close 关闭套接字
在Linux系统下,close
函数用于关闭文件,我们知道实际上在网络中通信其实也是对文件进行操作,所以通信结束后我们需要关闭套接字,其函数原型如下:
int close(int fd);
参数:fd
:是要关闭的套接字描述符(也就是由socket
函数创建的套接字描述符)。
返回值:如果关闭成功,返回0;如果失败,返回 - 1,并设置errno
来指示错误类型。
案例:echosever
.PHONY:all
all:server client
server:UdpServermain.ccg++ -o $@ $^ -std=c++17
client:UdpClientmain.ccg++ -o $@ $^ -std=c++17
.PHONY:clean
clean:rm -f server client
UdpServer.hpp
#include "common.hpp"const uint16_t default_port = 8080;
class UdpServer
{
public:UdpServer(uint16_t port = default_port): _port(port), _sockfd(-1){// 创建socket_sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (_sockfd < 0){cout << "create socket error" << endl;exit(SOCKET_ERROR);}// 将socket绑定到ip和端口struct sockaddr_in local;bzero(&local, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(_port);//local.sin_addr.s_addr = inet_addr(_ip.c_str());//云服务器不允许直接 bind 公有IP,我们也不推荐编写服务器的时候,bind 明确的 IP,推荐直接写成 INADDR_ANY//在网络编程中,当一个进程需要绑定一个网络端口以进行通信时,可以使用INADDR_ANY 作为 IP 地址参数。//这样做意味着该端口可以接受来自任何 IP 地址的连接请求,无论是本地主机还是远程主机。例如,如果服务//器有多个网卡(每个网卡上有不同的 IP 地址),使用 INADDR_ANY 可以省去确定数据是从服务器上具体哪个//网卡/IP 地址上面获取的。local.sin_addr.s_addr = INADDR_ANY;int n = bind(_sockfd, (struct sockaddr *)&local, sizeof(local));if (n < 0){cout << "bind socket error" << endl;exit(BIND_ERROR);}}~UdpServer(){if (_sockfd > 0)close(_sockfd);_sockfd = -1;cout << "socket closed" << endl;}void start(){// 循环接收数据while (true){struct sockaddr_in from;socklen_t len = sizeof(from);char buf[1024];int n = recvfrom(_sockfd, buf, sizeof(buf) - 1, 0, (struct sockaddr *)&from, &len);if (n > 0){buf[n] = 0;string ip = inet_ntoa(from.sin_addr);int port = ntohs(from.sin_port);cout << "receive from [" << ip << ":" << port << "]#" << buf << endl;sendto(_sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&from, len);}}}private:uint16_t _port;int _sockfd;
};
UdpServermain.cc
#include "UdpServer.hpp"
#include <iostream>
using namespace std;
//./server localport
int main(int argc, char *argv[])
{if (argc != 2){cout << "Usage:./server localport" << endl;return Usage_ERROR;}int port = stoi(argv[1]);UdpServer server(port);server.start();return 0;
}
UdpClientmain.cc
#include "common.hpp"
//./client server_ip server_port
int main(int argc, char *argv[])
{if (argc != 3){cout << "Usage: " << argv[0] << " sever_ip sever_port" << endl;return Usage_ERROR;}// 创建socketint sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0){cout << "create socket error" << endl;exit(SOCKET_ERROR);}// 填充一下 server 信息string serverip = argv[1];int serverport = stoi(argv[2]);struct sockaddr_in serveraddr;bzero(&serveraddr, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(serverport);serveraddr.sin_addr.s_addr = inet_addr(serverip.c_str());// client 要不要进行 bind? 一定要 bind 的!!// 但是不需要显示 bind,client 会在首次发送数据的时候会自动进行bind// 为什么?server 端的端口号,一定是众所周知,不可改变的,client非常多,需要 bind 随机端口.while (true){cout << "please input message:";string message;getline(cin, message);sendto(sockfd, message.c_str(), message.size(), 0, (struct sockaddr *)&serveraddr, sizeof(serveraddr));char buf[1024];struct sockaddr_in tmp;socklen_t len = sizeof(tmp);int n = recvfrom(sockfd, buf, sizeof(buf) - 1, 0, (struct sockaddr *)&tmp, &len);if (n > 0){buf[n] = 0;cout << "server say:" << buf << endl;}elsebreak;}return 0;
}
以上为Linux版本,Windows版本如下:
#include <iostream>
#include <cstdio>
#include <thread>
#include <string>
#include <cstdlib>
#include <WinSock2.h>
#include <Windows.h>
#pragma warning(disable : 4996)
#pragma comment(lib, "ws2_32.lib")
using namespace std;
string serverip = "110.41.138.70";// 填写云服务器ip
int serverport = 8080;// 填写云服务开放的端口
int main( )
{WSADATA wsa;WSAStartup(MAKEWORD(2, 2), &wsa);//创建socketint sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0){cout << "create socket error" << endl;return 1;}//填充server信息struct sockaddr_in serveraddr;memset(&serveraddr, sizeof(serveraddr),0);serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(serverport);serveraddr.sin_addr.s_addr = inet_addr(serverip.c_str());while (true){cout << "please input message:";string message;getline(cin, message);sendto(sockfd, message.c_str(), message.size(), 0, (struct sockaddr*)&serveraddr, sizeof(serveraddr));char buf[1024];struct sockaddr_in tmp;int len = sizeof(tmp);int n = recvfrom(sockfd, buf, sizeof(buf) - 1, 0, (struct sockaddr*)&tmp, &len);if (n > 0){buf[n] = 0;cout << "server say:" << buf << endl;}}closesocket(sockfd);WSACleanup();return 0;
}
- WSADATA:保存初始化 Winsock 库时返回的信息。
- SOCKET:表示一个套接字描述符,用于在网络中唯一标识一个套接字。
- sockaddr_in:IPv4 地址结构体,用于存储 IP 地址和端口号等信息。
- socket():创建一个新的套接字。
- bind():将套接字与本地地址绑定。
- listen():将套接字设置为监听模式,等待客户端的连接请求。
- accept():接受客户端的连接请求,并返回一个新的套接字描述符,用于与客户端进行通信。
相关文章:
Linux网络 UDP socket
背景知识 我们知道, IP 地址用来标识互联网中唯一的一台主机, port 用来标识该主机上唯一的一个网络进程,IPPort 就能表示互联网中唯一的一个进程。所以通信的时候,本质是两个互联网进程代表人来进行通信,{srcIp&…...
Day2——需求分析与设计
教师端签到应用软件的需求分析; 产品经理如何写好产品需求文档(附模板) 需求分析是软件开发过程中的关键步骤,它确保了开发的软件能够满足用户的需求。以下是进行需求分析的具体步骤: 1. 确定分析目标 明确教师端签到…...
aosp15上winscope离线html如何使用?
背景: aosp15上的如何使用Winscope前面已经有分享过相关的blog,这块其实和aosp14没啥大的差别,具体可以看如下2个文章: 手把手教你aosp14编译Winscope 安卓aosp15手机上如何离线获取winscope文件 文章中也说明在aosp15如果直接使…...
AttributeError: module numpy has no attribute int .报错解决
AttributeError: module numpy has no attribute int .报错解决方案_attributeerror: module numpy has no attribute i-CSDN博客 以上为参考教程,试了卸载再安装,不行,报错: Found existing installation: numpy 1.24.3 error: …...
python爬虫常用数据保存模板(Excel、CSV、mysql)——scrapy中常用数据提取方法(CSS、XPATH、正则)(23)
文章目录 1、常用数据保存模板2.1 保存为Excel格式2.2 保存为CSV格式2.3 保存至mysql数据库2、scrapy中常用数据提取方法2.1 XPath选择器2.2 CSS选择器2.3 正则表达式1、常用数据保存模板 2.1 保存为Excel格式 # 1、导入模块 from openpyxl import workbook# 2、创建一个exce…...
【面试题】简述rabbitmq的组织架构
[面试题]简述rabbitmq的组织架构 RabbitMQ 是一种流行的消息中间件,其架构设计围绕消息生产者, 消息消费者和消息中转(Broker)展开。以下是 RabbitMQ 的主要组织架构组件和它们之间的关系: 1. 核心组件 1.1 Producer࿰…...
C#-WPF 常见类型转换方法(持续更新)
目录 一、普通类型转换 1、Convert类 2、Parse(转String) 3、TryParse(转String) 4、ToString(转String) 5、int转double 6、String转DateTime 7、自定义类型的显示/隐式转换 二、byte[]转ImageSource 方法一 方法二 一、普通类型转换 1、Convert类 提供了一种安全…...
c基础加堆练习题
1】思维导图: 2】在堆区空间连续申请5个int类型大小空间,用来存放从终端输入的5个学生成绩,然后显示5个学生成绩,再将学生成绩升序排序,排序后,再次显示学生成绩。显示和排序分别用函数完成 要求ÿ…...
做了一份前端面试复习计划,保熟~
前言 以前我看到面试贴就直接刷掉的,从不会多看一眼,直到去年 9 月份我开始准备面试时,才发现很多面试经验贴特别有用,看这些帖子(我不敢称之为文章,怕被杠)的过程中对我的复习思维形成影响很大…...
虚幻引擎开发命名规则
UE的命名规则如下: 模版类以T作为前缀,例如TArray, TMap, TSet。UObject派生类都以U前缀。AActor派生类都以A前缀。SWidget派生类都以S前缀。全局对象使用G开头,如GEngine。抽象接口以I前缀。枚举以E开头。bool变量以b前缀,如bPe…...
【蓝桥杯每日一题】砍竹子
砍竹子 2024-12-7 蓝桥杯每日一题 砍竹子 STL 贪心 题目大意 这天, 小明在砍竹子, 他面前有 nn 棵竹子排成一排, 一开始第 ii 棵竹子的 高度为 h i h_i hi. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为…...
Lambda表达式随记
学习链接 目录 作用定义[capture list] 捕获列表(paramter) 参数列表mutable 可变规格throw() 异常说明-> return-type 返回类型{function statement} lambda函数体 Lambda表达式的优缺点Lambda表达式工作原理适用场景STL算法库短小不需要复用函数场景 作用 Lambda表达式&…...
Vulhub:Log4j[漏洞复现]
CVE-2017-5645(Log4j反序列化) 启动靶场环境 docker-compose up -d 靶机IPV4地址 ifconfig | grep eth0 -A 5 ┌──(root㉿kali)-[/home/kali/Desktop/temp] └─# ifconfig | grep eth0 -A 5 eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 in…...
ubuntu系统生成SSL证书配置https
自签名【Lets Encrypt】的测试证书,有效期三个月。 第一步:安装acme,如果没有安装git,需要提前安装 下载came资源 git clone https://github.com/Neilpang/acme.sh.git 无法访问,可以试用gitee的资源,安…...
记录 idea 启动 tomcat 控制台输出乱码问题解决
文章目录 问题现象解决排查过程1. **检查 idea 编码设置**2. **检查 tomcat 配置**3.检查 idea 配置文件4.在 Help 菜单栏中,修改Custom VM Options完成后保存,并重启 idea 问题现象 运行 tomcat 后,控制台输出乱码 解决排查过程 1. 检查 id…...
C++ unordered_map和unordered_set的使用
1.unordered_set系列的使用 1.1unordered_set和unordered_multiset参考文档 unordered_set和unordered_multiset参考文档 1.2unordered_set类的介绍 • unordered_set的声明如下,Key就是unordered_set底层关键字的类型 • unordered_set默认要求Key⽀持转换为整…...
【探商宝】OpenAI 发布 Sora:视频生成领域的重大突破
2024 年 12 月 10 日,OpenAI 正式推出了备受瞩目的人工智能视频生成模型 Sora,这一举措在科技界引起了轩然大波,为视频创作领域带来了全新的可能性和变革. 一、Sora 的功能与特性 1. 强大的视频生成能力 Sora 能够根据用户输入的文本描述生…...
[代码随想录Day32打卡] 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
理论基础 题型 动归基础(这一节就是基础题)背包问题打家劫舍股票问题子序列问题 动态规划五部曲 确定dp数组及其下标的含义确定递推公式dp数组如何初始化遍历顺序打印dp数组 509. 斐波那契数 简单~ dp数组及下标含义: dp[i]表示第i各斐…...
【实操GPT-SoVits】声音克隆模型图文版教程
项目github地址:https://github.com/RVC-Boss/GPT-SoVITS.git官方教程:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/tkemqe8vzhadfpeu本文旨在迅速实操GPT-SoVits项目,不阐述技术原理(后期如果有时间研究&#…...
开发一套SDK 第一弹
自动安装依赖包 添加条件使能 #ex: filetypesh bash_ls 识别 达到预期,多个硬件环境 等待文件文件系统挂在完成 或者创建 /sys/class/ 属性文件灌入配置操作 AI 提供的 netlink 调试方法,也是目前主流调用方法,socket yyds #include <linux/module.h> #include <linux…...
2024149读书笔记|Hans的阿狸五部曲——成长的路上分离在所难免
2024149读书笔记|Hans的阿狸五部曲——成长的路上分离在所难免 1. 《阿狸和小小云》2. 《阿狸和小玉》3. 《阿狸呓语》4. [202480读书笔记|《阿狸和弯月亮》——生的再普通,也是限量版](https://blog.csdn.net/qq_40985985/article/details/139731131)5. 《阿狸永远…...
外包干了5天,技术明显退步。。。。。
先说一下自己的情况,本科生,19年通过校招进入南京某软件公司,干了接近3年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…...
Ubuntu22.04 安装Isaac Lab
目录 1.1 安装IsaacLab 1.1.1 下载文件 1.1.2 创建Isaac Sim符号链接 1.1.3 创建并激活conda环境 1.1.4 安装依赖 1.1.5 安装IsaacLab扩展 1.1.6 安装完成,要source一下 1.2 验证IsaacLab安装 1.1 安装IsaacLab 1.1.1 下载文件 将 Isaac Lab 仓库克隆到您的…...
unity 2D像素种田游戏学习记录(自用)
一、透明度排序轴 改变sprite的排序方式,默认按照z轴进行排序(离摄像机的远近)。可以将其改变成y轴的排序方式,这样可以使2D人物走在草丛的下方就不被遮挡,走在草丛上方就被遮挡,如下图。 在项目设置-图形…...
NIFI使用
1 从Kafka接收消息,存储到数据库中。 (1) ConsumerKafka processor (2)Execute Scripts Processor 我这里是使用JS脚本进行处理。 还有很多其他语言的脚本。 var flowFile session.get(); if (flowFile ! null) {v…...
vue3+vite+ts 使用webrtc-streamer播放海康rtsp监控视频
了解webrtc-streamer webrtc-streamer 是一个使用简单机制通过 WebRTC 流式传输视频捕获设备和 RTSP 源的项目,它内置了一个小型的 HTTP server 来对 WebRTC需要的相关接口提供支持。相对于ffmpegflv.js的方案,延迟降低到了0.4秒左右,画面的…...
Nanolog起步笔记-9-log解压过程(3)寻找meta续
Nanolog起步笔记-9-log解压过程-3-寻找meta续 当前的目标新的改变decompressNextLogStatementmetadata查看业务面的log语句注释掉 runBenchmark();改过之后,2条记录之后,这里就直接返回了 小结 当前的目标 没有办法,还要继续。 当前的目标&a…...
未来网络技术的新征程:5G、物联网与边缘计算(10/10)
一、5G 网络:引领未来通信新潮流 (一)5G 网络的特点 高速率:5G 依托良好技术架构,提供更高的网络速度,峰值要求不低于 20Gb/s,下载速度最高达 10Gbps。相比 4G 网络,5G 的基站速度…...
【北京迅为】iTOP-4412全能版使用手册-第六十八章 U-boot基础知识
iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...
go 中线程安全map
在 Go 语言中,官方包 sync.Map 确实提供了线程安全的映射数据结构。然而,正如你所提到的,使用 sync.Map 时,有时需要进行类型断言,这可能会让代码显得冗长或不直观。 如果你希望使用一个更加易用的线程安全映射&#…...
封装类与普通类的区别
1 封装类的好处 数据隐藏:通过封装,我们可以将类的内部实现细节隐藏起来,只暴露有限的接口。这样,外部代码就不能直接访问或修改类的内部状态,从而保证了数据的安全性和完整性。 数据保护:封装可以…...
StarRocks-hive数据类型导致的分区问题
背景: 有个hive的表,是月分区的(month_id),分区字段用的是string类型。数据量比较大,为了保证计算性能,所以把数据导入到SR里,构建一个内部表。但是在建表的时候想使用月分区使用pa…...
Java面试题精选:设计模式(二)
1、装饰器模式与代理模式的区别 1)代理模式(Proxy Design Pattern ) 原始定义是:让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许将请求提交给对象前后进行一些处理。 代理模式的适用场景 功能增强 当需要对一个对…...
【JavaEE】多线程(7)
一、JUC的常见类 JUC→java.util.concurrent,放了和多线程相关的组件 1.1 Callable 接口 看以下从计算从1加到1000的代码: public class Demo {public static int sum;public static void main(String[] args) throws InterruptedException {Thread …...
技术型企业如何高效搭建企业博客以增强品牌影响力和市场竞争力
在数字化时代,技术型企业面临着激烈的市场竞争和快速变化的行业环境。为了在这场竞争中脱颖而出,企业需要寻找新的营销渠道和品牌建设工具。企业博客作为一种低成本、高效率的在线内容平台,已经成为技术型企业增强品牌影响力和市场竞争力的重…...
【qt环境配置】windows下的qt与vs工具集安装\版本对应关系
vs工具集安装通过vs的在线安装器勾选工具集即可 工具包下载路径:https://www.microsoft.com/zh-cn/download/details.aspx?id40784 配置工具集在qt中可以自动扫描到 《正确在 Windows 上配置 MSVC(2019) 作为 Qt 编译器》https://b3logfile.com/pdf/article/15922…...
XTuner 微调实践微调
步骤 0. 使用 conda 先构建一个 Python-3.10 的虚拟环境 cd ~ #git clone 本repo git clone https://github.com/InternLM/Tutorial.git -b camp4 mkdir -p /root/finetune && cd /root/finetune conda create -n xtuner-env python3.10 -y conda activate xtuner-env…...
docker compose
Docker的理念是一个容器只运行一个服务。而 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具 1 2。通过 docker-compose.yml 文件,用户可以配置应用程序服务,并使用简单的一条命令便可以创建和启动所有服务。这是关于 Docker Compose …...
Java 中的方法重写
在 Java 中,方法重写(Method Overriding)是面向对象编程的一个重要概念,它指的是子类中存在一个与父类中相同名称、相同参数列表和相同返回类型的方法。方法重写使得子类可以提供特定的实现,从而覆盖(或改变…...
阿里云ECS服务器域名解析
阿里云ECS服务器域名解析,以前添加两条A记录类型,主机记录分别为www和,这2条记录都解析到服务器IP地址。 1.进入阿里云域名控制台,找到域名 ->“解析设置”->“添加记录” 2.添加一条记录类型为A,主机记录为www,…...
非父子通信(扩展)-- event bus 事件总线
创建一个空实例Bus, export default 导出Bus 过程:由A组件对Bus组件进行监听,B组件触发Bus对应的事件,由于A组件进行监听,触发事件之后就会进行A组件的回调,那么就可以将消息发送给A了 在src文件夹下新建utils文件夹&a…...
【Linux系列】获取当前目录
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
大模型:把GPT搬回家 - chatGPT的本地化API -Node.js调用
chatGPT拒绝了中国大陆和中国香港的访问,包括api的调用。这使得我们无法使用目前来讲确实YYLX的生产工具,仔细想一下其实还是可以曲线解决的,本文的介绍仅供学习参考。 用Node.jschatGPT提供的API,就可以在自己本地或者自己的服务…...
【Qt项目实战】使用脚本拓展CPP应用程序(2)——Lua脚本及编辑器
考古 《【Qt项目实战 】:使用脚本拓展CPP应用程序(1)——Lua脚本及编辑器》 一、LuaBridge 最近在项目的某个模块再次使用Lua作为程序拓展语言,开发了一些新的功能。 这里借助 LuaBridge 轻松实现Qt调用C类成员函数及成员对象等…...
【RBF SBN READ】hadoop社区基于RBF的SBN READ请求流转
读写分离功能的背景及架构 当前联邦生产集群的各个子集群只有Active NameNode在工作,当读写任务变得繁忙的时候,只有一个Active负责处理的话,此时集群的响应和处理能力业务侧感知会明显下降,为此,我们将引入Observer架构,实现读写功能的分离,使得Active只负责写请求,而…...
【教学类-36-08】20241210对称蝴蝶——去白边(图案最大化)一大和一大二小
背景需求 前期制作了对称蝴蝶,用来涂色,幼儿很喜欢 【教学类-36-07】20230707三只对称蝴蝶(midjounery-niji)(涂色、裁剪、游戏(飞舞的蝴蝶))_对称图案涂色-CSDN博客文章浏览阅读49…...
Flume——sink连接hdfs的参数配置(属性参数+时间参数)
这可不是目录 配置文件官网说明属性参数时间参数 配置文件官网说明 可以参考官网的说明 属性参数 属性名称默认值说明channel-type-组件类型名称,必须是hdfshdfs.path-HDFS路径,例如:hdfs://mycluster/flume/mydatahdfs.filePrefixFlumeDa…...
lc字符串相加——模拟
415. 字符串相加 - 力扣(LeetCode) 不准调用封装好的那些库。手动模拟两数相加,记录进位。主要当其中短的数字计算完了怎么办,技巧为下标为负数时就当做0,相当于补0一样。 class Solution {public String addStrings…...
框架建设实战6——缓存组件
说起分布式缓存,如今redis大行其道。不过,我们在创建缓存组件时,需要着重考虑如下几点: 1.客户端选型 本组件基于springboot2的默认实现,即lettuce客户端。不同客户端区别如下: 名称描述 优缺点分析 jedis1.springboot1.5.*默认 2.老牌客户端,使用稳定…...
基于springboot使用Caffeine
Caffeine 是一个基于 Java 的高性能、现代化的缓存库。它由 Ben Manes 开发,受 Google Guava 缓存库的启发,但具有更好的性能和更多的功能。 Caffeine 的核心特点 高性能 基于 Java 8 的现代化设计,利用高级并发算法,提供极低的延…...