做暖暖免费网站,半路学网站建设难吗,加猛挣钱免费做网站软件,thinkphp做视频网站From: https://www.mobibrw.com/2016/3490
libuv 是重写了下libev#xff0c;封装了windows和unix的差异性。 libuv的特点 非阻塞TCP套接字 socket#xff1f; 非阻塞命名管道 UDP 定时器 子进程 fork? 通过 uv_getaddrinfo实现异步DNS 异步文件系统API uv_fs_* 高分辨率时…From: https://www.mobibrw.com/2016/3490
libuv 是重写了下libev封装了windows和unix的差异性。 libuv的特点 非阻塞TCP套接字 socket 非阻塞命名管道 UDP 定时器 子进程 fork? 通过 uv_getaddrinfo实现异步DNS 异步文件系统API uv_fs_* 高分辨率时间 uv_hrtime 正在运行程序路径查找 uv_exepath 线程池调度 uv_queue_work TTY控制的ANSI转义代码 uv_tty_t 文件系统事件支持 inotify ReadDirectoryChangesW kqueue 马上回支持 uv_fs_event_t 进程间的IPC与套接字共享 uv_write2
事件驱动的风格程序关注/发送事件在事件来临时给出反应。 系统编程中一般都是在处理I/O而IO的主要障碍是网络读取在读取的时候是阻塞掉的。标准的解决方案是使用多线程每一个阻塞的IO操作被分配到一个线程。当线程block处理器调度处理其他线程。 libuv使用了另一个方案异步。操作系统提供了socket的事件即使用socket监听socket事件即可。
libuv简单使用 创建一个loop关闭loop。 #include stdio.h #include stdlib.h #include uv.h
int main() { uv_loop_t *loop malloc(sizeof(uv_loop_t)); uv_loop_init(loop);
printf(hello, libuv);
uv_run(loop, UV_RUN_DEFAULT);
uv_loop_close(loop); free(loop);
return 0; }
如果只需要一个loop的话调用uv_default_loop就可以了。 tipsNodejs中使用了这个loop作为主loop。 uv_loop_t *loop uv_default_loop();
uv_run(loop, UV_RUN_DEFAULT);
uv_loop_close(loop);
Error 初始化或同步函数会在执行失败是返回一个负数可以通过uv_strerror、uv_err_name获得这个错误的名字和含义 I/O函数的回调函数会被传递一个nread参数如果nread小于0也代表出现了错误。
Handle Request libuv的工作建立在事件的监听上通常通过handle来实现handle中uv_TYPE_t中的type指定了handle监听的事件。 在uv.h中可以找到handle和request的定义 /* Handle types. */ typedef struct uv_loop_s uv_loop_t; typedef struct uv_handle_s uv_handle_t; typedef struct uv_stream_s uv_stream_t; typedef struct uv_tcp_s uv_tcp_t; typedef struct uv_udp_s uv_udp_t; typedef struct uv_pipe_s uv_pipe_t; typedef struct uv_tty_s uv_tty_t; typedef struct uv_poll_s uv_poll_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; typedef struct uv_fs_event_s uv_fs_event_t; typedef struct uv_fs_poll_s uv_fs_poll_t; typedef struct uv_signal_s uv_signal_t;
/* Request types. */ typedef struct uv_req_s uv_req_t; typedef struct uv_getaddrinfo_s uv_getaddrinfo_t; typedef struct uv_getnameinfo_s uv_getnameinfo_t; typedef struct uv_shutdown_s uv_shutdown_t; typedef struct uv_write_s uv_write_t; typedef struct uv_connect_s uv_connect_t; typedef struct uv_udp_send_s uv_udp_send_t; typedef struct uv_fs_s uv_fs_t; typedef struct uv_work_s uv_work_t;
/* None of the above. */ typedef struct uv_cpu_info_s uv_cpu_info_t; typedef struct uv_interface_address_s uv_interface_address_t; typedef struct uv_dirent_s uv_dirent_t;
handle是持久化的对象。在异步操作中相应的handle有许多关联的request。 request是短暂性的通常只维持一个回调的时间一般对应handle的一个IO操作。request用来在初始函数和回调函数中传递上下文。 例如uv_udp_t代表了一个udp的socket每一个socket的写入完成后都有一个uv_udp_send_t被传递。
handle的设置 uv_TYPE_init(uv_loop_t*, uv_TYPE_t);
一个idle handle的使用例子 观察下它的生命周期 #include stdio.h #include uv.h
int counter 0;
void wait_for(uv_idle_t * handle) { counter;
if (counter 10e6) { uv_idle_stop(handle); } }
int main() { uv_idle_t idler;
uv_idle_init(uv_default_loop(), idler); uv_idle_start(idler, wait_for);
printf(Idle......);
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
uv_loop_close(uv_default_loop());
return 0; }
参数传递 handle和request都有一个data域用来传递信息。uv_loop_t也有一个相似的data域。
文件系统 简单的文件读写是通过uv_fs_*函数族和与之相关的uv_fs_t结构体完成的。 系统的文件操作是阻塞的所以libuv在线程池中调用这些函数最后通知loop。
如果没有指定回调函数文件操作是同步的return libuv error code。 异步在传入回调函数时调用return 0。
获得文件描述符 int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int mode, uv_fs_cb cb) 关闭文件描述符 int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) 回调函数 void callback(uv_fs_t* req); 还有uv_fs_read uv_fs_write uv_fs_t构成了基本的文件操作
流操作使用uv_stream_t比基本操作方便不少 uv_read_start uv_read_stop uv_write 流操作可以很好的配合pipe使用 pipe相关函数 uv_pipe_init uv_pipe_open uv_close
文件事件 uv_fs_event_t uv_fs_event_init uv_fs_event_start
网络 uv_ip4_addr ip为 0.0.0.0表示绑定所有接口 255.255.255.255是一个广播地址意味着数据将往所有的子网接口发送端口号0表示由操作系统随机分配一个端口 tcp TCP是面向连接的字节流协议因此基于libuv的stream实现 uv_tcp_t 服务器端创建流程 uv_tcp_init 建立tcp句柄 uv_tcp_bind 绑定 uv_listen 建立监听当有新的连接到来时激活调用回调函数 uv_accept 接收链接 使用stream处理数据以及与客户端通信
客户端 客户端比较简单只需要调用uv_tcp_connect
udp UDP是不可靠连接libuv基于uv_udp_t和uv_udp_send_t udp的流程与tcp类似
libuv提供了一个异步的DNS解决方案提供了自己的getaddrinfo 配置好主机参数addrinfo后使用uv_getaddrinfo即可
调用uv_interface_addresses获得系统的网络信息
未完待续。
来源http://luohaha.github.io/Chinese-uvbook/source/introduction.html