libuv3_handle

libuv 之定时器的使用 libuv 定时器使用,一个定时器配合着一个回调函数,简单方便,只管定时和时间到了的处理函数,libuv去到哪都是回调,精华所在。 使用的API,主要是uv_timer_start uv_timer_start,参数有4个,分别是:timer定时器,回调函数,延时时间,重复间隔。 UV_EXTERN int uv_timer_start(uv_timer_t* handle, uv_time... 阅读详情

1. handle

  loop的调度一般通过二种模式调度,一种是Handle,一种是Request。Handle一般关联一个长期任务,request关联一个一次性任务。比如一个socket的监听任务,就是uv_udp_t(handle),而一次数据的发送就是一个请求任务,关联请求句柄uv_udp_send_t(request)。

1.1. handle对象

#define UV_HANDLE_FIELDS                                                      \
  /* public */                                                                \
  void* data;                                                                 \
  /* read-only */                                                             \
  uv_loop_t* loop;                                                            \
  uv_handle_type type;                                                        \
  /* private */                                                               \
  uv_close_cb close_cb;                                                       \
  void* handle_queue[2];                                                      \
  union {                                                                     \
    int fd;                                                                   \
    void* reserved[4];                                                        \
  } u;                                                                        \
  UV_HANDLE_PRIVATE_FIELDS                                                    \

/* The abstract base class of all handles. */
struct uv_handle_s {
  UV_HANDLE_FIELDS
};
/* Handle types. */
typedef struct uv_loop_s uv_loop_t;

typedef struct uv_stream_s uv_stream_t;     //详见libuv5_net
typedef struct uv_tcp_s uv_tcp_t;           //详见libuv5_net
typedef struct uv_udp_s uv_udp_t;           //详见libuv5_net
typedef struct uv_pipe_s uv_pipe_t;         //详见libuv5_net
typedef struct uv_tty_s uv_tty_t;           //详见libuv5_net

typedef struct uv_handle_s uv_handle_t;     //详见下边内容
typedef struct uv_timer_s uv_timer_t;       //详见下边内容
typedef struct uv_prepare_s uv_prepare_t;   //详见下边内容
typedef struct uv_check_s uv_check_t;       //详见下边内容
typedef struct uv_idle_s uv_idle_t;         //详见下边内容
typedef struct uv_async_s uv_async_t;       //详见下边内容

typedef struct uv_process_s uv_process_t;   //详见libuv8_process
typedef struct uv_signal_s uv_signal_t;     //详见libuv8_process
typedef struct uv_poll_s uv_poll_t;         //详见libuv10_常用结构

typedef struct uv_fs_event_s uv_fs_event_t;  //详见 libuv6_flle
typedef struct uv_fs_poll_s uv_fs_poll_t;    //详见 libuv6_flle
typedef struct uv_dir_s uv_dir_t;            //deprecated,详见 libuv6_flle

1.2. handle通用API

int uv_is_active(const uv_handle_t* handle);
int uv_is_closing(const uv_handle_t* handle);
void uv_close(uv_handle_t* handle, uv_close_cb close_cb);

void uv_ref(uv_handle_t*);
void uv_unref(uv_handle_t*);
int uv_has_ref(const uv_handle_t*);

size_t uv_handle_size(uv_handle_type type);
uv_handle_type uv_handle_get_type(const uv_handle_t* handle);
const char* uv_handle_type_name(uv_handle_type type);

uv_loop_t* uv_handle_get_loop(const uv_handle_t* handle);
void* uv_handle_get_data(const uv_handle_t* handle);
void uv_handle_set_data(uv_handle_t* handle, void* data);

int uv_send_buffer_size(uv_handle_t* handle, int* value);
int uv_recv_buffer_size(uv_handle_t* handle, int* value);

int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd);
  • uv_is_active 请求是否处于活动状态,活动状态返回非0.判读是否是活动状态标准如下

    • uv_async_t 启动后就处于active状态,uv_close 后,处于非active状态
    • uv_pipe_t, uv_tcp_t, uv_udp_t, etc. handle等I/O handle当处于读,写,状态时,处于active状态
    • 异步handle执行uv_*start后,就处于active状态,uv_*stop后,处于非active状态
    • 其他的hangle,比如 uv_foo_t,执行 vu_foo_start()函数的时候激活,执行uv_foo_stop()处于非激活状态
  • uv_is_closing: 是否关闭,如果正在关闭或已经关闭返回非0

  • uv_close:从endgame队列中删除,关闭指定句柄,回调可以为空(同步返回),比如关闭定时器、idle、prepare等,一般和各种init成对出现。

  • uv_ref: 指定句柄为ref状态,如果有处于ref状态的 loop 就不会退出,多次调用无效

  • uv_unref: 与uv_ref相反,取消引用,多次无效(标志设置),设置后不作为loop循环运行的条件

    • 一个应用场景就是,loop中,创建一个timer用于回收一些其他req或者handle的资源,创建timer之后,就可以通过uv_unref调用,减除timer的引用,当其他handle或者req全部退出的时候,loop也可以正常退出。
  • uv_has_ref: Returns non-zero if the handle referenced, zero otherwise.

  • uv_handle_get_type: Returns handle->type

    • uv_handle_size: Returns the size of the given handle type.
    • uv_handle_type_name: 类型名称, e.g. “pipe” (as in uv_pipe_t) for UV_NAMED_PIPE.
  • uv_handle_get_loop:Returns handle->loop.

  • uv_handle_get_data:Returns handle->data.

  • uv_handle_set_data:Sets handle->data to data.

  • uv_send_buffer_size:设置,发送缓存大小,注意:linux会设置二倍大小

  • uv_recv_buffer_size : 获取,发送缓存大小,注意:linux会设置二倍大小

  • uv_fileno : 提取句柄。比如:handle->io_watcher.fd;

1.3. uv_async_t

//uv_req_s详见 req.md
#define UV_ASYNC_PRIVATE_FIELDS                                               \
  struct uv_req_s async_req;                                                  \
  uv_async_cb async_cb;                                                       \
  /* char to avoid alignment issues */                                        \
  char volatile async_sent;
typedef struct uv_async_s {
  UV_HANDLE_FIELDS
  UV_ASYNC_PRIVATE_FIELDS
}uv_async_t;
typedef void (*uv_async_cb)(uv_async_t* handle);
int uv_async_init(uv_loop_t*, uv_async_t* async, uv_async_cb async_cb);
int uv_async_send(uv_async_t* async);

异步通信handle,从结构来看,既包含uv_req_s,也包含 uv_handle_s(UV_HANDLE_FIELDS)

  • uv_async_init:初始化async句柄。 A NULL callback is allowed.

    • Returns:0 on success, or an error code < 0 on failure.Note
    • Unlike other handle initialization functions, it immediately starts the handle.
  • uv_async_send:通知async句柄,此函数是线程安全的,但是多次发送uv_async_send有可能只触发一次uv_async_cb。

    • Returns:0 on success, or an error code < 0 on failure.Note
    • It’s safe to call this function from any thread. The callback will be called on the loop thread.

1.4. idle/prepare/check

#define UV_IDLE_PRIVATE_FIELDS                                                \
  uv_idle_t* idle_prev;                                                       \
  uv_idle_t* idle_next;                                                       \
  uv_idle_cb idle_cb;
typedef struct uv_idle_s {
  UV_HANDLE_FIELDS
  UV_IDLE_PRIVATE_FIELDS
}uv_idle_t;
void (*uv_idle_cb)(uv_idle_t* handle)
int uv_idle_init(uv_loop_t*, uv_idle_t* idle);
int uv_idle_start(uv_idle_t* idle, uv_idle_cb cb);
int uv_idle_stop(uv_idle_t* idle);

#define UV_PREPARE_PRIVATE_FIELDS                                             \
  uv_prepare_t* prepare_prev;                                                 \
  uv_prepare_t* prepare_next;                                                 \
  uv_prepare_cb prepare_cb;

typedef struct uv_prepare_s {
  UV_HANDLE_FIELDS
  UV_PREPARE_PRIVATE_FIELDS
}uv_prepare_t;
typedef void (*uv_prepare_cb)(uv_prepare_t* handle);
int uv_prepare_init(uv_loop_t*, uv_prepare_t* prepare);
int uv_prepare_start(uv_prepare_t* prepare, uv_prepare_cb cb);
int uv_prepare_stop(uv_prepare_t* prepare);

#define UV_CHECK_PRIVATE_FIELDS                                               \
  uv_check_t* check_prev;                                                     \
  uv_check_t* check_next;                                                     \
  uv_check_cb check_cb;
typedef struct uv_check_s {
  UV_HANDLE_FIELDS
  UV_CHECK_PRIVATE_FIELDS
}uv_check_s;
typedef void (*uv_check_cb)(uv_check_t* handle);
int uv_check_init(uv_loop_t*, uv_check_t* check);
int uv_check_start(uv_check_t* check, uv_check_cb cb);
int uv_check_stop(uv_check_t* check);

uv__handle_init() -> uv__handle_start() -> uv__handle_stop() - > uv__handle_closing() -> uv_want_endgame()-> uv__handle_close()

1, init,初始化,返回句柄。
2,start,添加句柄到执行队列,准备执行,设置回调,如果handle已经存在,添加无效。不管是否有效,都返回0
3,stop,从执行队列移到endgame队列。

一般idle作为辅助消息起作用,一般和其他消息一块运行,用来检测其他消息是否真正执行。或者是否执行完成。

1.5. 定时器timer

#define UV_TIMER_PRIVATE_FIELDS                                               \
  void* heap_node[3];                                                         \
  int unused;                                                                 \
  uint64_t timeout;                                                           \
  uint64_t repeat;                                                            \
  uint64_t start_id;                                                          \
  uv_timer_cb timer_cb;

typedef struct uv_timer_s {
  UV_HANDLE_FIELDS
  UV_TIMER_PRIVATE_FIELDS
}uv_timer_t;

void (*uv_timer_cb)(uv_timer_t* handle);
int uv_timer_init(uv_loop_t*, uv_timer_t* handle);

int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat);
int uv_timer_stop(uv_timer_t* handle);

int uv_timer_again(uv_timer_t* handle);

void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat);
uint64_t uv_timer_get_repeat(const uv_timer_t* handle);

实现定时器功能

  • uv_timer_init 出事后初始化定时器
  • uv_timer_start
    • 开始计时器,timeout:首次触发时间,repeat:重复间隔时长(milliseconds)
    • 如果连续调用二次start,第二次覆盖第一次。
    • 如果两个定时间触发时间点相同,按照start执行的先后顺序触发。
    • cb不可以为空,否则失败
    • uv_timer_t在uv_timer_stop之前必须有效,否则触发崩溃
  • uv_timer_stop 停止计时器,可以使用uv_close(uv_handle_t*, NULL)代替。
  • uv_timer_again 重新开始
  • uv_timer_set_repeat 设置 repeat 变量, 单位:milliseconds
  • uv_timer_get_repeat 获取 repeat 变量, 单位:milliseconds

1.6. 参考资料

  1. uv_handle_t
  2. uv_async_t
  3. prepare
  4. check
  5. idle
libuv介绍和实现的基本流程 文章目录前言一、libuv核心是什么?二、libuv简单介绍1.简单实现2.监视器3.handle的通用API总结 前言 libuv是一个高性能的,事件驱动的I/O库,并且提供了跨平台(如windows, linux)的API。 一、libuv核心是什么? libuv核心工作是提供一个event-loop,还有基于I/O和其它事件通知的回调函数。libuv还提供了一些核心工具,例如定时器,非阻塞的网络支持,异步文件系统访问,子进程等。 二、libuv简单介绍 1.简单实现 1、libuv的实现流程为: 阅读详情

相关推荐

libuv 编译

转:libuv介绍 一、简介  1.开源跨平台的异步IO库(网络异步、文件异步等),它是node.js的底层库。  2.官方网站:http://libuv.org。  3.事件循环模型:IOCP、epoll、kqueue、event ports。  4.管理的模块(异步TCP、UDP sockets、DNS解析、异步文件读写、信号处理、高性能定时器、进程/线程池)。   二、架构图 ...

qq_32250025的博客 1459

libuv学习笔记(3)

libuv学习笔记(3) uv_handle_t结构体以及相关函数

paohui0134的博客 3886

C/C+++服务器之libuv的使用实战

C/C++服务器基础

小星AI 2454

libuv之定时器---timer.c

#include "uv.h" #include "uv-common.h" #include "heap-inl.h" #include &lt;assert.h&gt; #include &lt;limits.h&gt; // 取出loop中的计时器堆指针 static struct heap *timer_heap(const uv_loop_t* loop) { #ifdef _W...

标子 的专栏 1262

IEDA激活码失效?教你5分钟快速续期的方法

本文针对IEDA激活码失效问题,提供了一套从快速应急到深度排查的完整解决方案。文章不仅详解了5分钟快速续期与清理缓存等应急方法,更深入剖析了授权机制、离线激活流程,并指导如何构建可持续的授权管理策略,帮助开发者彻底解决激活困扰,确保开发环境稳定。

a0b1c2d3的专栏 273

11、rsa-目标主机支持RSA密钥交换【原理扫描】的漏洞

通过将 etcd 的 TLS 密钥交换算法从 RSA 升级为 ECDHE,可实现前向保密,彻底消除 “私钥泄露导致历史流量解密” 的风险。核心步骤是通过强制启用含ECDHE的套件,并禁用 RSA 密钥交换套件,同时建议升级到 TLS 1.2+ 并优化证书类型(优先 ECDSA)。这一配置符合云原生安全最佳实践,也是 Kubernetes 等依赖 etcd 的系统推荐的安全标准。生成临时密钥的具体步骤是什么?如何验证etcd是否已成功更新为ECDH密钥交换算法?配置临时密钥交换算法可能带来哪些性能影响。

xuebo1129927648的博客 1万+

Libuv Timer定时器

在定时器启动后一段特定的时间后,定时器会调用回调函数。Libuv的定时器还可以设定为按照时间间隔定时启动,而不仅仅是启动一次。简单地使用一个定时器,超过时间timeout作为参数初始化定时器(意味第一次启动之后多久响应回调事件),还有一个可选参数repeat。定时器可以在任意时刻被终止。上述操作会启动一个循环定时器(repeating timer),它会调用uv_timer_start后,5秒(timeout)启动回调函数,然后每2秒(repeat)循环启动回调函数。来终止一个定时器。

田螺姑娘的博客 2651

从mseed到SAC格式转换全攻略:mseed2sac工具安装与批量处理技巧

本文详细介绍了如何将mseed格式的地震数据高效转换为SAC格式,涵盖mseed2sac工具的安装、单文件转换技巧、批量处理自动化实现以及元数据高级处理策略。通过具体命令和脚本示例,帮助地震学研究者快速掌握数据预处理的关键技术,提升波形数据分析效率。

ruby5的博客 927

Libuv 各个回调(异步)事件的调用时机

下面有一个应用场景,与uv_close的调用时机有关,服务端有一个心跳检测机制,判断连接上来每个会话(Session)是否具有活性。其中,ClientHeartCheck是一个定时器事件,定时时间为3000。

田螺姑娘的博客 1396

行测测评——矩阵、圆形、环形三角图形数列推理解题技巧

写在前面:各大公司的测评做的让人眼花缭乱,很多题型都是第一次见,比如逻辑关系、信息推理,最难的要属找规律的数字推理了。根据B站UP主刘文超老师的课程,记录一下解题技巧。感谢UP主的无私奉献,原地址连接:https://www.bilibili.com/video/BV1it411M7o2?t=528&p=7 解题技巧: 从图形的上下、左右、交叉 角度进行尝试求解 基本法则是“加、减、乘、除、倍数、次方”六种形态。 一、有心数阵 解题技巧:周边数字通过某种运算得到中间数字 1.周边数..

涵盖了计算机专业基础知识、数学建模相关实践、复杂网络论文研究、LeetCode算法刷题经验、C语言开发经验、前端Vue、React框架开发实战相关知识 8642

SAP 经营范围(Operating Concern) 和业务范围 (Business Area) 在核算架构或是管理架构中的区别和联系分别是什么 请给具体的示例

摘要:SAP系统中,业务范围(Business Area)和经营范围(Operating Concern)在核算架构中具有不同功能。业务范围是FI/CO共用维度,用于跨公司码的业务线核算(如电子产品、机械设备),支持内部管理和简单对外报表。经营范围则是CO-PA专属维度,聚焦获利能力分析,可细化到产品+客户+区域组合(如分析手机在华东区域的获利情况)。两者存在层级关联:经营范围包含业务范围作为基础维度,业务范围数据会传递至经营范围进行深度分析。实际应用中需先配置业务范围,再设置经营范围并关联相关维度,共同支

金牌架构师 95

【libuv高效编程】libuv学习超详细教程9——libuv async异步句柄解读

libuv系列文章 【libuv高效编程】libuv学习超详细教程1——libuv的编译与安装 【libuv高效编程】libuv学习超详细教程2——libuv框架初窥 【libuv高效编程】libuv学习超详细教程3——libuv事件循环 【libuv高效编程】libuv学习超详细教程4——libuv idle空闲句柄解读 【libuv高效编程】libuv学习超详细教程5——l...

杰杰的博客 5141

RK3588 C++ MeloTTS 推理

本文介绍了基于RK3588平台和RKNN工具链实现的端侧语音合成(TTS)系统。该系统支持中英文混合输入处理,通过自动合并英文单词、转换标点符号等方式预处理文本,并将其转换为音素和声调序列。核心推理流程包含编码器、中间处理和解码器三个阶段:编码器将音素序列转为隐藏状态,中间处理调节音调和语速,解码器生成最终波形。代码示例展示了输入数据设置和模型推理过程,利用RK3588内置NPU实现高效语音合成。该系统展现了在边缘计算设备上实现复杂AI任务的能力。

J。 199

【libuv高效编程】libuv学习超详细教程10 —— libuv stream 流句柄解读

文章目录libuv系列文章stream handle数据结构内部APIuv__stream_init()uv__read()uv__write()uv__stream_io()uv__write_callbacks()外部API参考例程代码获取 libuv系列文章 【libuv高效编程】libuv学习超详细教程1——libuv的编译与安装 【libuv高效编程】libuv学习超详细教程2—...

杰杰的博客 3100

【C#程序员入门AI】向量数据库入门:C#集成Chroma/Pinecone,实现AI知识库检索(RAG基础)

向量存语义,检索补知识!向量数据库:解决AI知识库存储和语义检索问题,让AI有据可查C#集成:Chroma轻量本地练手,Pinecone企业云端落地,一套逻辑无缝切换RAG闭环:检索+大模型,让AI回答精准不瞎编,是AI落地的必经之路咱C#程序员有.NET生态加持,集成向量数据库比Python更简洁、更稳定,不管是个人做智能助手,还是企业做知识库,这套技术栈都能直接落地,2026年必学技能!

人工智能AI技术 1002

构建一个基于Simulink的LC滤波器仿真模型

需求分析LC滤波器(Inductor-Capacitor Filter)是一种常见的无源滤波器,广泛应用于电力电子、通信、音频处理等领域。其主要作用是平滑输入信号中的高频谐波成分,保留低频或直流成分,从而提高输出信号的质量。在电力电子系统中,LC滤波器常用于逆变器、整流器等设备的输出端,以减少开关噪声和电磁干扰(EMI),确保输出电压和电流的稳定性。本项目将基于Simulink平台,开发一个完整的LC滤波器仿真模型,涵盖从电源输入到滤波输出的整个过程,并通过PI控制器实现对滤波效果的闭环控制。

MHD0815的博客 740

libuv队列

走读libuv源代码。可以看到如下定义: typedef void *QUEUE[2]; /* Private macros. */ #define QUEUE_NEXT(q) (*(QUEUE **) &((*(q))[0])) #define QUEUE_PREV(q) (*(QUEUE **) &((*(q))[1])) #define QUEU...

xinqingwuji的博客 467

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

libuv学习-udp传输

req:一个指向 uv_udp_send_t 结构体实例的指针,表示发送请求。uv_udp_t 结构体包含了一系列用于配置和管理UDP套接字的成员变量,以及一系列用于操作UDP套接字的函数。handle:一个指向已初始化的 uv_udp_t 结构体实例的指针,表示要开始接收数据的 UDP 套接字。handle:一个指向已初始化的 uv_udp_t 结构体实例的指针,表示要绑定的 UDP 套接字。handle:一个指向已初始化的 uv_udp_t 结构体实例的指针,表示要使用的 UDP 套接字。

weixin_33962473的博客 2844

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【libuv高效编程】libuv学习超详细教程11 —— libuv stream 流句柄解读 下

文章目录libuv系列文章stream handle 的外部APIuv_shutdown()uv_listen()uv_accept()uv_read_start()uv_read_stop()uv_write()uv_write2()函数参考例程代码获取 libuv系列文章 【libuv高效编程】libuv学习超详细教程1——libuv的编译与安装 【libuv高效编程】libuv学习超...

杰杰的博客 3295

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

libuv 原理_Libuv初理解

整体概念libuv是一个跨平台、专门写给nodejs的库,它的设计是围绕着事件驱动的异步I/O模型。在不同的I/O轮询机制上,libuv提供的不是简单抽象对象:handle和streams为sockets和其他实例提供了一个高级抽象。此外,libuv还提供了跨平台文件I/O和线程化功能这里有一个图表,说明了构成libuv的不同部分以及它们与什么子系统相关:handles和requestlibuv给...

weixin_39702559的博客 709

learnuv最佳实践:避免libuv开发中的常见陷阱与错误模式

你是否正在学习libuv这个强大的跨平台异步I/O库,却发现调试异步代码比编写它还要困难?😅 作为Node.js的核心底层库,libuv提供了强大的异步编程能力,但同时也带来了许多容易踩坑的地方。本文将为你揭示libuv开发中的常见陷阱,并分享learnuv项目中的最佳实践,帮助你快速掌握这个强大的工具! ## 为什么libuv开发容易出错? libuv是一个基于事件驱动的跨平台异步I/O库

gitblog_00584的博客 476

【libuv高效编程】libuv学习超详细教程5——libuv prepare 准备句柄解读

prepare handle可以被译为准备句柄,如果程序中启动了prepare handle后,那么它在每次事件循环的时候都会被执行一遍,并且在I/O轮询之前被执行,注意,虽然它的原理与idle handle差不多,但是还是有一些差别的。

杰杰的博客 2665

Nodejs事件引擎libuv源码剖析之:句柄(handle)结构的设计剖析

声明:本文为原创博文,转载请注明出处。 句柄(handle)代表一种对持有资源的索引,句柄的叫法在window上较多,在unix/linux等系统上大多称之为描述符,为了抽象不同平台的差异,libuv使用统一的结构封装了不同平台的实现,接下来就看看这个抽象的过程。由于句柄的实现和系统平台有很大关系,本文只针对unix平台作源码分析。 一、抽象的开始----封装、继承、多态 ...

weixin_30258901的博客 229

异步I/O库-libuv介绍

libuv是一个跨平台的支持事件驱动的异步I/O的库,使开发者可以以非阻塞的方式执行文件I/O操作、网络通信、子进程管理等。事件循环:libuv有一个基于事件循环的模型,它不断地轮询事件,并在事件发生时调用相应的回调函数。异步I/O:libuv提供了异步文件I/O和网络I/O的接口,使得开发者可以执行I/O操作而不阻塞主线程。线程池:libuv使用线程池来处理一些不能以非阻塞方式执行的I/O操作,如文件系统操作在某些操作系统上。DNS解析:libuv提供了异步DNS解析的接口。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 4153

libuv_UDP服务器搭建

设计概述 http://docs.libuv.org/en/v1.x/design.html 服务器绑定端口 1: 初始化服务器 udp handle: uv_udp_init(event_loop, &amp;udp_server); 2:配置绑定IP与端口: struct sockaddr_in addr; uv_ip4_a...

Economic_shark的博客 2613

libuv套接字绑定失败导致的退出异常

1、问题 套按字绑定失败导致的loop退出异常 2、环境 libuv版本:1.42.0及以下 OS版本:win10 x64 3、现象 uv_async_send的回调方法中,使用uv_udp_bind(或者uv_tcp_bind,后文以udp举例),将一个本机不存在的IP,绑定到uv_udp_t(或者uv_tcp_t)代表的handle(new创建),绑定返回失败后,对handle进行释放(delete);在退出loop的过程中,应用发生异常。 备注:由于主机IP的人为修改等业务性操作

smartcore 1248
上一篇: libuv2_loop
下一篇: libuv4_req
knowledgebao
博客等级 码龄15年 401粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值