【网络】Socket套接字
目录
一、端口号
二、初识TCP/UDP协议
三、网络字节序
3.1 概念
3.2 常用API
四、Socket套接字
4.1 概念
4.2 常用API
(1)socket
(2)bind
sockaddr结构
(3)listen
(4)accept
(5)connect
(6)recvfrom
(7)sendto
4.3 地址转换函数
(1)inet_aton
(2)inet_addr
(3)inet_pton
一、端口号
网络协议栈中的下三层,主要解决的是如何将数据安全可靠的送到远端机器上的问题。
在上层,用户使用特定的应用层软件完成数据的发送和接收。而软件在启动后变为了进程,因此我们日常网络通信的本质,就是进程间通信!
问题1:一个进程通过网络将数据传输到远端主机上时,如何区分要把数据传给主机上的哪个进程呢?
实际上,每个进程都有属于自己的端口号(port)。IP地址用于标识主机的唯一性,而端口号则用于标识一个进程在该主机中的唯一性。所以网络通信中我们不止需要IP地址来找到目标主机,还需要端口号找到目标进程
端口号是传输层协议的内容,是一个2字节16位的整数,用于在主机中标识一个进程的唯一性。因此通过IP地址+端口号就能标识全网唯一的一个进程
问题2:进程PID也可以标识进程在主机中的唯一性,为什么还要有端口号?
- 不是所有的进程都需要进行网络通信,但是所有进程都要有自己的PID
- 将系统和网络功能解耦
一个端口号只能被一个进程绑定,但一个进程可以绑定多个端口号
二、初识TCP/UDP协议
传输层协议(TCP和UDP)的数据段中分别记录了源端口号和目的端口号,用来描述数据是从哪个进程发的、要发给哪个进程
关于TCP和UDP协议,我们首先对它们有一个简单且直观的认识,后续再进行深入了解
TCP(Transmission Control Protocol,传输控制协议):
- 面向连接
- 保证数据传输可靠性
- 面向字节流
UDP(User Datagram Protocol,用户数据报协议):
- 无连接
- 不保证数据传输可靠性
- 面向数据报
三、网络字节序
3.1 概念
内存中的多字节数据相对于内存地址而言有大端和小端的区别,因此主机也分为大端机和小端机
让我们回顾一下大端和小端的概念
大端:数据的高位存储在内存的低位
小端:数据的高位存储在内存的高位
不止是内存,网络数据流中同样有大端小端之分。发送方在发送数据时通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收方将数据保存在接收缓冲区中,也是按内存地址从低到高的顺序保存。
问题在于,不同类型的主机在跨网络互相传输数据时就可能导致问题。例如大端机将数据发送给小端机,就可能导致数据的错乱
因此TCP/IP协议规定,发送到网络中的数据流应统一按照大端字节序发送。也就是说不论是大端机还是小端机,都要按照TCP/IP规定的网络字节序来发送或接收数据
所以如果发送数据的主机是小端机,必须先将数据转换成大端字节序后再发送。在后面调用套接字相关API时,我们也通常需要对端口号和ip地址进行网络字节序转换。
3.2 常用API
为了让网络程序具有可移植性,我们可以使用下列库函数进行主机字节序和网络字节序的转换
#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
其中h表示host,n表示network,l表示32位长整型,s表示16位短整型
例如htonl就是将32位长整型从主机字节序转为网络字节序,适用于转换IP地址
如果主机字节序本身是小端,调用对应库函数后则会将参数做相应大小端转换后返回;如果主机字节序已经是大端了,则不作改变
四、Socket套接字
4.1 概念
套接字(Socket)是一种独立于协议的网络编程接口,是对网络中不同主机的应用进程之间进行双向通信的端点的抽象。套接字上联应用进程,下接网络协议栈,是应用程序与网络协议栈进行交互的接口。
套接字包括 IP 地址和端口号两个部分,可以用来区分不同的进程之间的数据传输。传输层使用的协议不同,套接字的种类也会发生相应的改变。
在Linux中,套接字的本质也是文件,因此有对应的网络文件描述符,用户通过网络文件描述符对套接字进行操作。
4.2 常用API
(1)socket
#include <sys/types.h>
#include <sys/socket.h>int socket(int domain, int type, int protocol);
socket函数类似于打开文件的操作,会创建套接字并返回一个网络文件描述符,其中:
- domain:协议域,又称协议族,例如AF_INET代表IPv4协议,AF_INET6代表IPv6协议
- type:指定socket类型,例如流式套接字SOCK_STREAM(TCP)和数据报套接字SOCK_DGRAM(UDP)
- protocal:指定协议信息,常见的有IPPROTO_TCP、IPPROTO_UDP等,通常设置为0代表自动选择套接字类型对应的默认协议
创建成功返回一个网络文件描述符,失败返回-1并设置环境变量errno
例如:
(2)bind
#include <sys/types.h>
#include <sys/socket.h>int bind(int socket, const struct sockaddr *address, socklen_t address_len);
bind函数用于将一个服务的ip地址和端口号绑定到一个套接字上,一般是服务端在绑定监听套接字时会用到。客户端则不必要调用bind绑定,因为客户端的端口号由内核自动分配
其中:
- socket:待绑定的网络文件描述符
- address:指向一个sockaddr结构体的指针,该结构体包含了要绑定的ip地址和端口号
- address_len:address指向的结构体大小
成功绑定返回0, 失败返回-1并设置errno
例如:
uint16_t port = 8888; //端口号
string ip = "127.0.0.1"; //字符串格式的ip地址
int sockfd = socket(AF_INET, SOCK_STREAM, 0); //创建套接字
if (sockfd < 0)
{// 创建套接字失败时//...
}
//填充结构体字段
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET; //IPv4协议
local.sin_port = htons(port);
inet_aton(ip.c_str(), &(local.sin_addr));
if (bind(sockfd, (struct sockaddr *)&local, sizeof(local)) < 0) // 绑定
{//绑定失败时//...
}
填充结构体字段时,需要对端口号进行网络字节序转换和对字符串格式的ip地址转四字节ip地址后再填充到sockaddr_in结构体中
关于ip地址的格式转换函数会在后面提及,这里先简单提一下sockaddr的结构
sockaddr结构
关于socket的API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6等,但是各种网络协议的地址格式并不相同。
例如IPv4的地址用sockaddr_in结构体表示,其中包含16位地址类型、16位端口号和32位ip地址
不同的结构体中,前16位都填充了ip地址的协议类型,因此我们可以统一用struct sockaddr*类型接收,取得结构体首地址后按位数获取地址类型字段就可以确定是哪一种结构体了。
在使用Unix域套接字进行本机进程间通信时,绑定时就得使用sockaddr_un结构
(3)listen
#include <sys/types.h>
#include <sys/socket.h>int listen(int sockfd, int backlog);
listen函数常用于服务端监听来自客户端的TCP连接请求,通常在调用bind函数后使用,成功返回0,失败返回-1并设置errno
其中:
- sockfd:将被设置为监听状态的网络文件描述符
- backlog:设置全连接队列的长度(全连接队列用于临时维护未被上层accept的已经建立好的连接,长度为backlog+1)
例如:
uint16_t port = 8888; //端口号
string ip = "127.0.0.1"; //字符串格式的ip地址
int sockfd = socket(AF_INET, SOCK_STREAM, 0); //创建套接字
if (sockfd < 0)
{// 创建套接字失败时//...
}
//填充结构体字段
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET; //IPv4协议
local.sin_port = htons(port);
inet_aton(ip.c_str(), &(local.sin_addr));
if (bind(sockfd, (struct sockaddr *)&local, sizeof(local)) < 0) // 绑定
{//绑定失败时//...
}
if (listen(sockfd, 10) < 0) // 将套接字设置为监听状态,全连接队列最多存放10+1个连接
{//监听失败时//...
}
(4)accept
#include <sys/types.h>
#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
accept函数常用于服务端从全连接队列中接收来自客户端的TCP连接请求并创建一个新的套接字,通常用于listen函数后。成功会返回该套接字的文件描述符用来负责后续的数据通信服务,失败返回-1并设置errno。
如果全连接队列中暂时没有Tcp连接请求,accept函数将阻塞等待直到有客户端发起连接请求(除非服务器处于非阻塞状态)
其中:
- sockfd:被绑定并设置为监听状态的套接字对应的文件描述符
- addr:指向sockaddr结构体的指针,用于填充客户端对应的地址信息。设置为NULL表示不关心客户端地址
- addrlen:指向socklen_t的指针,表示addr的大小
例如:
uint16_t port = 8888; //端口号
string ip = "127.0.0.1"; //字符串格式的ip地址
int sockfd = socket(AF_INET, SOCK_STREAM, 0); //创建套接字
if (sockfd < 0)
{// 创建套接字失败时//...
}
//填充结构体字段
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET; //IPv4协议
local.sin_port = htons(port);
inet_aton(ip.c_str(), &(local.sin_addr));
if (bind(sockfd, (struct sockaddr *)&local, sizeof(local)) < 0) // 绑定
{// 绑定失败时//...
}
if (listen(sockfd, 10) < 0) // 将套接字设置为监听状态,全连接队列最多存放10+1个连接
{// 监听失败时//...
}
struct sockaddr_in client; // 存储客户端信息的结构体
socklen_t len = sizeof(client);
int newfd = accept(sockfd, (struct sockaddr *)&client, &len); // sockfd只负责获取连接,newfd负责后续的数据通信服务
if (newfd < 0)
{// 接收失败时//...
}
(5)connect
#include <sys/types.h>
#include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
connect函数常用于发起建立网络连接的请求,成功返回0,失败返回-1并设置errno
其中:
- sockfd:调用socket函数创建套接字成功后返回的文件描述符
- addr:指向sockaddr结构体的指针,其中包含了准备建立连接的目标服务器地址信息
- addrlen:addr指向的结构体的大小
例如:
string serverip = "127.0.0.1";
uint16_t serverport = 8888;
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字
if (sockfd < 0)
{// 创建套接字失败时//...
}
// 填充结构体字段
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(serverport);
inet_pton(AF_INET, serverip.c_str(), &(server.sin_addr));
// 发起连接
int n = connect(sockfd, (struct sockaddr *)&server, sizeof(server));
if (n < 0)
{// 连接发起失败时//...
}
(6)recvfrom
#include <sys/types.h>
#include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
recvfrom常用于使用UDP协议(或其他无连接的数据报服务)时从套接字中读取数据,成功返回读取到的字节数,当套接字已经关闭时返回0,出错返回-1并设置errno
其中:
- sockfd:已打开的套接字文件描述符
- buf:指向用于存放接收到的数据的缓冲区的指针
- len:缓冲区大小
- flags:控制接收行为的标志,通常设置为0表示阻塞模式
- src_addr:指向一个sockaddr结构体,存储数据来源方的地址信息
- addrlen:代表sockaddr结构体的大小
例如:
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 创建套接字
if (sockfd < 0)
{//...
}
char buffer[1024];
sockaddr_in temp;
socklen_t len = sizeof(temp);
ssize_t s = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0,(struct sockaddr *)&temp, &len); // 接收服务端返回的消息
//...
(7)sendto
#include <sys/types.h>
#include <sys/socket.h>ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
sendto函数常用于使用UDP协议时通过指定的socket将数据发送到目标主机,成功返回实际发送的字节数,失败返回-1并设置errno
其中:
- sockfd:已打开的套接字文件描述符
- buf:指向要发送的数据
- len:要发送的数据长度
- flags:标志位,通常设置为0
- dest_addr:指向存储目标主机地址信息的sockaddr结构体
- addrlen:结构体大小
4.3 地址转换函数
sockaddr_in结构体中的成员sin_addr表示32位的ip地址,但我们日常中见到的ip地址通常是点分十进制格式的字符串表示的。通过一些函数可以实现ip地址在两种格式间的转换。
字符串转32位ip地址:
(1)inet_aton
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int inet_aton(const char *cp, struct in_addr *inp);
其中:
- cp:待转换的点分十进制ip地址字符串
- inp:指向in_addr结构体的指针,存储转换后的网络字节序ip地址
in_addr内部存放了一个32位整型用于存储转换后的ip地址,其结构如下:
typedef uint32_t in_addr_t;
struct in_addr
{in_addr_t s_addr;
};
例如:
struct sockaddr_in addr;
inet_aton("127.0.0.1", &addr.sin_addr);
(2)inet_addr
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>in_addr_t inet_addr(const char *cp);
其中cp是待转换的点分十进制ip地址字符串
例如:
struct sockaddr_in addr;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
(3)inet_pton
#include <arpa/inet.h>int inet_pton(int af, const char *src, void *dst);
其中:
- af:协议族
- src:指向点分十进制ip地址字符串的指针
- dst:指向用于存储转换后ip地址的内存区域
网络字节序ip地址转点分十进制的函数有inet_ntoa、inet_ntop,有兴趣的可以自行查阅文档
完.
相关文章:
【网络】Socket套接字
目录 一、端口号 二、初识TCP/UDP协议 三、网络字节序 3.1 概念 3.2 常用API 四、Socket套接字 4.1 概念 4.2 常用API (1)socket (2)bind sockaddr结构 (3)listen (4)a…...
蓝桥杯[每日一题] 真题:连连看
题目描述 小蓝正在和朋友们玩一种新的连连看游戏。在一个 n m 的矩形网格中,每个格子中都有一个整数,第 i 行第 j 列上的整数为 Ai, j 。玩家需要在这个网格中寻找一对格子 (a, b) − (c, d) 使得这两个格子中的整数 Aa,b 和 Ac,d 相等,且它…...
新手SEO优化实战快速入门
内容概要 对于SEO新手而言,系统化掌握基础逻辑与实操路径是快速入门的关键。本指南以站内优化为切入点,从网站结构、URL设计到内链布局,逐层拆解搜索引擎友好的技术框架;同时聚焦关键词挖掘与内容策略,结合工具使用与…...
Android面试总结之Glide源码级理解
当你的图片列表在低端机上白屏3秒、高端机因内存浪费导致FPS腰斩时,根源往往藏在Glide的内存分配僵化、磁盘混存、网络加载无优先级三大致命缺陷中。 本文从阿里P8级缓存改造方案出发,结合Glide源码实现动态内存扩容、磁盘冷热分区、智能预加载等黑科技&…...
基于类型属性的重载
算法重载 在一个泛型算法中引入更为特化的变体,这种设计和优化方式称为算法特化。之所以需要算法特化,原因有二: 针对特定类型使用更加合理的实现,对于const char *,less的第二个实现更加合理 template <typename…...
对称加密算法和非对称加密算法
在这个互联网普及的时代,在不同终端对敏感甚至机密数据进行传输是非常常见的场景,但是如何保证数据传输过程的安全性和高效性是一个值得深入探讨的问题。 为此,伟大的人类研究出了多种加密算法,我们可以大致将其分为两类…...
工程数字建造管理系统平台有哪些?好的数字建造管理系统推荐
一、什么是工程数字建造管理系统平台? 工程数字建造管理系统平台是一种集成了先进信息技术(如云计算、大数据、物联网等)的综合性管理工具,它旨在通过数字化手段提升工程建造全过程的管理效率和决策水平。这一平台不仅覆盖了工程…...
CMake ERROR: arm-none-eabi-gcc is not able to compile a simple test program.
用 cmake 构建 STM32 工程问题【已解决】 环境信息 os: ubuntu22.04gcc: arm-none-eabi-gcc (Arm GNU Toolchain 13.2.rel1 (Build arm-13.7)) 13.2.1 20231009cmake: cmake version 3.22.1ninja: 1.10.1 问题 log [main] 正在配置项目: Olidy [driver] 删除 /home/pomegr…...
容器主机CPU使用率突增问题一则
关键词 LINUX、文件系统crontab 、mlocate根目录使用率 There are many things that can not be broken! 如果觉得本文对你有帮助,欢迎点赞、收藏、评论! 一、问题现象 业务一台容器服务器,近期经常收到cpu不定期抖动告警&#x…...
CTFshow【命令执行】web29-web40 做题笔记
web29----过滤关键字 正则匹配,过滤flag,可以使用通配符绕过 先查看目录 使用通配符?查看flag 点击查看源代码 web30---过滤函数和关键字 看到过滤了system执行系统命令和flag,php关键字 找一个与其功能差不多的执行函数passthr…...
L2正则化:优化模型的平滑之道
常见的正则化方法1. **L1正则化(Lasso)**1.1基本原理1.2特点1.3数学推导1.4参数更新1.5选择合适的正则化系数1.6优点1.7缺点1.8实际应用中的注意事项1.9示例 2. **L2正则化(Ridge)**L2正则化的定义L2正则化如何防止过拟合1. **限制…...
Golang 的 GMP 调度机制常见问题及解答
文章目录 Golang GMP 调度模型详解常见问题基础概念1. GMP 各组件的作用是什么?2. 为什么 Go 需要自己的调度器?3. GOMAXPROCS 的作用是什么? 调度流程4. Goroutine 如何被调度到 M 上执行?5. 系统调用会阻塞整个线程吗࿱…...
使用VSCODE导致CPU占用率过高的处理方法
1:cpptools 原因:原因是C/C会在全局搜索文件,可以快速进行跳转;当打开的文件过大,全局搜索文件会占用大量CPU; 处理方法: 1:每次只打开小文件夹; 2:打开大文…...
17--华为防火墙智能选路全解:网络世界的智能导航系统
华为防火墙智能选路全解:网络世界的智能导航系统 开篇故事:快递小哥的烦恼与网络世界的相似性 想象你是个快递站站长,每天要处理来自全国各地的包裹。突然某天遇到: 🚚 双11爆仓:如何把包裹最快送到客户手…...
CSS-BFC(块级格式化上下文)
一、BFC 的本质理解(快递仓库比喻) 想象一个快递分拣仓库(BFC容器),这个仓库有特殊的规则: 仓库内的包裹(内部元素)摆放不影响其他仓库包裹必须整齐堆叠,不能越界不同仓…...
Java 大视界 -- Java 大数据在智慧港口集装箱调度与物流效率提升中的应用创新(159)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
ZygoPlanner:一种基于图形的三阶段框架,用于颧骨种植体植入的最佳术前规划|文献速递-医学影像人工智能进展
Title 题目 ZygoPlanner: A three-stage graphics-based framework for optimal preoperative planning of zygomatic implant placement ZygoPlanner:一种基于图形的三阶段框架,用于颧骨种植体植入的最佳术前规划 01 文献速递介绍 1.1 研究背景 颧…...
【2.项目管理】2.4 Gannt图【甘特图】
甘特图(Gantt)深度解析与实践指南 📊 一、甘特图基础模板 项目进度表示例 工作编号工作名称持续时间(月)项目进度(周)1需求分析3▓▓▓░░░░░░░2设计建模3░▓▓▓░░░░░░3编码开发3.5░░░▓▓▓▓░░…...
python学习笔记(1)
为什么要学python 目前在研究网站的搭建,想通过python搭建一个我的世界资源买卖的平台,然后就开始研究python了,其实这不是我第一次研究python了,之前学的都不咋样,现在温故而知新,好好研究一下python。 Python的变量 在此之前先简单的介绍一下变量,给第一次接触的小…...
刚刚整理实测可用的股票数据API接口集合推荐:同花顺、雅虎API、智兔数服、聚合数据等Python量化分析各项数据全面丰富
在金融科技高速发展的今天,股票API接口已成为开发者、量化交易者和金融从业者的核心工具之一。它通过标准化的数据接口,帮助用户快速获取实时或历史市场数据,为投资决策、策略回测和金融应用开发提供支持。本文将深入解析股票API的核心功能、…...
2025 年吉林省燃气企业从业人员考试:实用备考攻略与考试提分要点
2025 年吉林省燃气企业从业人员考试报名通过吉林燃气行业管理系统。报名资料包含企业的环保达标证明(燃气行业涉及环保要求)、个人的岗位任职证明等。实用备考攻略是,关注吉林在燃气分布式能源系统建设方面的进展,结合《燃气冷热电…...
dubbo http流量接入dubbo后端服务
简介 dubbo协议是基于TCP的二进制私有协议,更适合作为后端微服务间的高效RPC通信协议,也导致dubbo协议对于前端流量接入不是很友好。在dubo框架中,有两种方式可以解决这个问题: 多协议发布【推荐】,为dubbo协议服务暴…...
自动驾驶04:点云预处理03
点云组帧 感知算法人员在完成点云的运动畸变补偿后,会发现一个问题:激光雷达发送的点云数据包中的点云数量其实非常少,完全无法用来进行后续感知和定位层面的处理工作。 此时,感知算法人员就需要对这些数据包进行点云组帧的处理…...
小程序中过滤苹果设备中的表情(即 emoji)
在小程序中过滤苹果设备中的表情(即 emoji),通常需要考虑以下几个方面:识别 emoji、处理用户输入、以及在显示或存储时进行过滤。以下是具体的实现思路和步骤: 1. 理解苹果中的表情(Emoji) 苹果…...
软件性能测试中的“假阳性”陷阱
软件性能测试中的“假阳性”陷阱主要表现为错误警报频繁、资源浪费严重、测试可信度降低。其中,错误警报频繁是最常见且最严重的问题之一,“假阳性”现象会导致开发团队在解决不存在的问题上花费大量时间。据行业调查显示,超过30%的性能优化成…...
现代优雅品牌杂志包装徽标设计衬线英文字体安装包 Relish – Aesthetic Font
CS Relish – 美学字体:优雅与现代简约的结合 永恒的现代 Serif 字体 CS Relish 是一种现代衬线字体,将极简主义美学与精致精致融为一体。凭借其时尚、干净的字体和平衡的结构,它给人一种优雅和现代的印象。这款字体专为那些欣赏微妙和优雅的…...
《Oracle服务进程精准管控指南:23c/11g双版本内存优化实战》 ——附自动化脚本开发全攻略
正在学习或者是使用 Oracle 数据库的小伙伴,是不是对于那个一直启动且及其占用内存的后台进程感到烦躁呢?而且即使是手动去开关也显得即为麻烦,所以基于我之前所学习到的方法,我在此重新整理,让大家动动手指就能完成开…...
《寒门枭雄传》章回目录与核心故事设计(36回)
《寒门枭雄传》章回目录与核心故事设计(36回) 主线:寒门崛起→权力异化→制度轮回 核心冲突:个人奋斗 vs 制度性压迫 第一卷京口草鞋摊的野望(第1-12回) 主题:寒门之困始于生存,终…...
C语言学习笔记(抱佛脚版)
毕业一年,发现记性是真的差,每次想起之前的知识总是想不全,看别人写的资料也懵懵懂懂。于是我索性自己再学一遍,并且记录一下。希望对你们也有所帮助。 正片开始! 前面的什么if for都不难理解,嵌套的话也…...
DeepSeek-V3-0324 模型发布:开源 AI 性能再攀高峰,推理与编码能力逼近顶级闭源模型
2025 年 3 月 24 日,国内 AI 公司深度求索(DeepSeek)悄然推出 V3 模型的升级版本 DeepSeek-V3-0324。尽管此次更新并非市场期待的 V4 或 R2 版本,但其在推理速度、编码能力、数学推理及开源生态上的突破,仍迅速引发全球…...
清晰易懂的Cursor实现AI编程从安装到实战TodoList开发
一、Cursor简介与安装部署 什么是Cursor? Cursor是一款基于AI的智能代码编辑器,它集成了强大的AI编程助手功能,能够通过自然语言交互帮助开发者生成、优化和调试代码。与传统的代码编辑器不同,Cursor可以理解你的编程意图&#…...
(二) 深入了解AVFoundation - 播放:AVFoundation 播放基础入门
引言 AVFoundation 是 Apple 提供的强大多媒体框架,支持音视频播放、录制、处理等功能。在 iOS 开发中,AVFoundation 是实现视频播放的核心技术之一。 本篇文章将简单介绍如何使用 AVPlayer、AVPlayerItem 和 AVPlayerLayer 进行视频播放,并…...
重磅推出稳联技术Profinet转CANopen网关智能工厂解决方案!
重磅推出稳联技术Profinet转CANopen网关智能工厂解决方案! 稳联技术Profinet转CANopen网关应运而生——它如同一座智能桥梁☺,打通两大主流工业协议,让异构网络无缝互联,助您释放设备潜力,实现真正的“万物互联”&…...
【问题解决】Linux安装conda修改~/.bashrc配置文件后,root 用户下显示 -bash-4.2#
问题描述 在Linux安装conda下的python环境时候,修改了~/.bashrc文件,修改完成后,再次进入服务器后,登录时候显示的不是正常的[rootlocalhost ~]#,而是-bash-4.2# 原因分析: 网上原因有:/root下…...
关于deepseek
DeepSeek:领先的人工智能研究与创新公司 公司简介 DeepSeek(深度求索)是一家专注于人工智能(AI)技术研发的创新公司,致力于推动大模型、自然语言处理(NLP)、机器学习(M…...
EtherCAT转ProfiNet协议转换网关构建西门子PLC与海克斯康机器人的冗余通信链路
一、案例背景 某电子制造企业的5G通信模块组装线,采用西门子S7-1200PLC(ProfiNet主站)进行产线调度,而精密组装工序由3台海克斯康工业机器人(EtherCAT从站)完成。由于协议差异,机器人动作与PLC…...
李宏毅机器学习笔记(1)—机器学习基本概念+深度学习基本概念
机器学习基本概念 1、获取模型 步骤 1.1、假定未知函数 带未知参数的函数 1.2、定义损失函数 真实值:label MAE MSE 几率分布,cross-entropy? 1.3、优化 单独考虑一个参数 让损失函数最小,找导数为零的点 单独考虑w,w…...
RAG生成中的多文档动态融合及去重加权策略探讨
目录 RAG生成中的多文档动态融合及去重加权策略探讨 一、RAG生成概述 二、多文档动态融合策略 1. 拼接与分段编码 2. 独立编码与后续融合 3. 基于查询的动态加权 三、检索结果的去重与加权策略 1. 去重策略 2. 加权策略 四、实践中的挑战与思考 五、结语 RAG生成中的…...
对匿名认证的理解
概述:在 Spring Security 中,** 匿名认证(Anonymous Authentication)** 是一种特殊的认证机制,用于处理未提供有效凭证的请求。 匿名认证的本质 目的:允许未认证用户访问特定资源。原理: 当请求…...
leetcoed0044. 通配符匹配 hard
1 题目:通配符匹配 官方难度:难 给你一个输入字符串 (s) 和一个字符模式 ( p ) ,请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符匹配: ‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符序列(包括空字符序…...
航拍数据集汇总,覆盖车辆/船舶检测/物体评估/城市景观……
随着无人机的普及化和计算机视觉技术的迅猛发展,无人机航拍作为一种创新的摄影方式,正以前所未有的速度走进大众视野。它打破了传统拍摄的局限,为我们开启了「上帝视角」。航拍硬件性能逐渐逼近物理极限,算法优化的难度也日益增大…...
【SECS】初识SECS协议
【SECS】初识SECS协议 基本知识流和功能函数数量官方文件中缩写标注正常是不是都是主机向设备端?对数据信息中第1字节第1-2位官网介绍 S1F1双向指令说明测试H发起端E发起端 参考资料 基本知识 SECS(SEMI Equipment Communications Standard)即半导体设…...
RL基础以及AlphaGo、AlphaGo Zero原理
RL基础 Q价值函数和状态价值函数 Action-Value function: Q ( s , a ) Q(s, a) Q(s,a)是agent在状态s下执行某一个动作(如向上走),所获得的及时奖励和未来折扣的累计奖励 State-Value function: V ( s ) V(s) V(s)是…...
Android R adb remount 调用流程
目的:调查adb remount 与adb shell进去后执行remount的差异 调试方法:添加log编译adbd,替换system\apex\com.android.adbd\bin\adbd 一、调查adb remount实现 关键代码:system\core\adb\daemon\services.cpp unique_fd daemon_service_to…...
uvm sequence
UVM Sequence 是验证环境中生成和控制事务(Transaction)流的核心机制,它通过动态生成、随机化和调度事务,实现灵活多样的测试场景。以下是Sequence的详细解析: Sequence 的核心作用 事务流生成:通过 uvm_s…...
Java 代理(一) 静态代理
学习代理的设计模式的时候,经常碰到的一个经典场景就是想统计某个方法的执行时间。 1 静态代理模式的产生 需求1. 统计方法执行时间 统计方法执行时间,在很多API/性能监控中都有这个需求。 下面以简单的计算器为例子,计算加法耗时。代码如下…...
《初级社会工作者》考试题,附答案解析
一、单项选择题(共 60 题,每题 1 分) 1. 社会工作者在社区中开展针对留守儿童的支持小组活动,发现一名儿童因父母长期外出务工而产生严重的分离焦虑。此时,社会工作者应首先采取的介入策略是( )…...
网盘解析工具1.3.0,修改了一些bug,建议更新到此版本
最近问题反馈比较多,本来想着周末再更新了来着,但是账号黑的实在太快了。排查了下应该是某度网盘的一个接口缺少了一些参数,导致一直进黑名单。所幸参数不难找,新版本已经修复了,建议大家赶紧更新到1.3.0版本ÿ…...
Multi-Stage Progressive Image Restoration论文阅读
摘要 图像复原任务在恢复图像时需要在空间细节与高层语境化信息之间取得复杂的平衡。本文提出了一种新颖的协同设计方法,能够最优地平衡这些竞争目标。我们的核心方案是一种多阶段架构,通过逐步学习退化输入的复原函数,将整体恢复过程分解为…...
了解图像质量评价指标PSNR
一、PSNR是什么 1.1 定义与数学公式 峰值信噪比(Peak Signal-to-Noise Ratio,PSNR)是数字图像处理领域最经典的客观质量评价指标之一。其核心思想是通过计算原始图像与失真图像之间的均方误差(MSE)来衡量失真程度&am…...