libuv tcp socket

服务器端的建立流程如下

  • uv_tcp_init建立tcp句柄。
  • uv_tcp_bind绑定。
  • uv_listen建立监听,当有新的连接到来时,激活调用回调函数。
  • uv_accept接收链接。
  • 使用stream处理来和客户端通信。

uv_tcp_bind

  • uv_tcp_t* handle
  • sockaddr* addr 代表端口号和ip地址的结构体
  • flags 使用ipv4的时候传递0,使用ipv6的时候用uv_tcp_flags的UV_TCP_IPV6ONLY 也就是1

uv_listen

  • uv_stream_t* stream 双工通道的抽象类,有三个实现 uv_tcp_t, uv_pipe_tuv_tty_t.
  • int backlog 表示accept queue的大小,如果达到这个值,server将发送一个ECONNREFUSED错误信息。实际操作中,内核会根据传入的backlog参数与系统参数somaxconn,取二者的较小值
  • uv_connection_cb 回调函数

uv_accept

  • uv_stream_t* server
  • uv_stream_t* client

uv_read_start

  • uv_stream_t* client
  • uv_alloc_cb alloc_cb 为每个数据包分配内存
  • uv_read_cb read_cb 读取数据后的回调函数

回调函数uv_alloc_cb

参数:

  • uv_handle_t *handle 与客户端建立的链接的句柄
  • size_t suggested_size 估计的数据包的大小
  • uv_buf_t *buf 数据存放的位置
typedef struct uv_buf_t {
  char* base;
  size_t len;
} uv_buf_t;

回调函数 uv_read_cb

参数:

  • uv_stream_t *client 与客户端建立的链接句柄
  • ssize_t nread 本次读取数据的大小
  • uv_buf_t *buf 数据存放位置

这里需要注意buf用完后要手动free掉,不要

uv_buf_init函数只把指针拷贝到结构体中,没有复制里面的内容。详见:https://stackoverflow.com/questions/38081423/libuv-and-uv-buf-init-who-should-free-what

示例代码地址

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 11,509评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,403评论 19 139
  • 教程一:视频截图(Tutorial 01: Making Screencaps) 首先我们需要了解视频文件的一些基...
    90后的思维阅读 10,256评论 0 3
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,872评论 24 1,002
  • 网络中进程之间如何通信 为了方便大家获取源代码,可以移步这里,GitHub源代码 进程通信的概念最初来源于单机系统...
    batbattle阅读 14,779评论 1 5