`
aigo
  • 浏览: 2635696 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

libuv关闭tcp server时需要执行的API

阅读更多

需要执行的接口有两个:

uv_shutdown

uv_close

 

具体用法见官方源码:test-shutdown-close.c

https://github.com/libuv/libuv/blob/v1.x/test/test-shutdown-close.c#L57

#include "uv.h"
#include "task.h"


static uv_shutdown_t shutdown_req;
static uv_connect_t connect_req;

static int connect_cb_called = 0;
static int shutdown_cb_called = 0;
static int close_cb_called = 0;


static void shutdown_cb(uv_shutdown_t* req, int status) {
  ASSERT(req == &shutdown_req);
  ASSERT(status == 0 || status == UV_ECANCELED);
  shutdown_cb_called++;
}


static void close_cb(uv_handle_t* handle) {
  close_cb_called++;
}


static void connect_cb(uv_connect_t* req, int status) {
  int r;

  ASSERT(req == &connect_req);
  ASSERT(status == 0);

  r = uv_shutdown(&shutdown_req, req->handle, shutdown_cb);
  ASSERT(r == 0);
  ASSERT(0 == uv_is_closing((uv_handle_t*) req->handle));
  uv_close((uv_handle_t*) req->handle, close_cb);
  ASSERT(1 == uv_is_closing((uv_handle_t*) req->handle));

  connect_cb_called++;
}


TEST_IMPL(shutdown_close_tcp) {
  struct sockaddr_in addr;
  uv_tcp_t h;
  int r;

  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
  r = uv_tcp_init(uv_default_loop(), &h);
  ASSERT(r == 0);
  r = uv_tcp_connect(&connect_req,
                     &h,
                     (const struct sockaddr*) &addr,
                     connect_cb);
  ASSERT(r == 0);
  r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
  ASSERT(r == 0);

  ASSERT(connect_cb_called == 1);
  ASSERT(shutdown_cb_called == 1);
  ASSERT(close_cb_called == 1);

  MAKE_VALGRIND_HAPPY();
  return 0;
}


TEST_IMPL(shutdown_close_pipe) {
  uv_pipe_t h;
  int r;

  r = uv_pipe_init(uv_default_loop(), &h, 0);
  ASSERT(r == 0);
  uv_pipe_connect(&connect_req, &h, TEST_PIPENAME, connect_cb);
  r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
  ASSERT(r == 0);

  ASSERT(connect_cb_called == 1);
  ASSERT(shutdown_cb_called == 1);
  ASSERT(close_cb_called == 1);

  MAKE_VALGRIND_HAPPY();
  return 0;
}

 

分享到:
评论

相关推荐

    libuv-httpserver-源码.rar

    4. 错误处理:在遇到网络异常或其他错误时,libuv-httpserver能够优雅地关闭连接,避免资源泄露。 三、源码解析 1. 服务器初始化:libuv-httpserver的初始化涉及创建事件循环、设置监听套接字以及注册连接事件的回...

    libuv API说明及用例

    ### libuv API说明及用例知识点详解 #### 一、概述 **libuv** 是一个多平台支持库,其设计核心在于提供高效的异步 I/O 操作。最初为 Node.js 而开发,但随后也被其他项目如 Luvit、Julia 和 pyuv 等采用。该库的...

    libuv封装,封装libuv网络库

    - `Server` 类:封装 Libuv 的 TCP 服务器,提供启动、停止服务的方法。 - `Connection` 类:表示单个客户端连接,负责读写数据。 - `Request` 和 `Response` 类:用于封装客户端的请求和服务器的响应。 - `Event...

    libuv-v1.42.0windows64位vs2015/2017项目

    - **线程池**:libuv 内建了一个线程池,用于执行耗时较长的 CPU 密集型任务,避免了单线程的性能瓶颈。 - **信号处理**:libuv 可以处理系统信号,如 SIGINT 和 SIGTERM,使应用能够优雅地处理中断请求。 **3. 在...

    cpp-libuv是一个多平台支持库专注于异步IO

    cpp_libuv::TcpServer server(&loop); server.listen(8080, on_connection); loop.run(); // 运行事件循环 return 0; } ``` 以上只是一个简单的示例,实际使用中,cpp-libuv可以与C++的其他库和框架结合,构建...

    simple-http-server:使用 libuv 写的一个简易的 HTTP 服务器

    libuv包含了许多关键组件,如TCP和UDP套接字、文件系统操作、线程池以及信号处理等,为开发者提供了构建复杂网络服务的基础。 简单HTTP服务器的实现主要涉及以下几个关键技术点: 1. **socket编程**:HTTP服务器的...

    net_uv:使用C ++封装libuv的网络库

    6. 当不再需要服务时,关闭处理器和事件循环。 通过net_uv,开发者可以专注于业务逻辑,而无需过于关注底层的网络细节。net_uv的源代码(如net_uv-master压缩包中的内容)是学习和理解如何封装libuv的好材料,其中...

    read-libuv-code:libuv原始分析

    - **线程**:libuv不直接提供线程API,但通过工作队列间接支持线程化执行。 6. **信号处理** - libuv可以注册信号处理器,使得应用程序能响应特定的系统信号。 7. **日志和调试** - 提供日志记录功能,便于调试...

    Android本地服务器框架node-android.zip

    支持 libUV, TCP, UDT, HTTP/HTTPP, WebSocket.特性:Node.js 0.10.x compatible APIlibUV native supportTimer, set/clear Timeout/IntervalEventEmitterStreamHttpParserHTTPHTTPP(run http over udp)TCPUDT(udp ...

    基于TCP协议的C++聊天软件源代码

    在C++中实现TCP通信需要使用套接字库,如伯克利套接字API,这是跨平台的网络编程接口。在C++中,通常会使用iostream库进行输入输出操作,而网络通信则通过socket函数来实现,如socket()用于创建套接字,bind()用于...

    C++ 实现WebSocket 服务器

    7. **资源释放**:当连接关闭时,确保释放所有相关资源,如关闭TCP套接字,清理内存等。 ### 总结 通过C++和libuv库,我们可以构建一个高效且灵活的WebSocket服务器。gbase的使用可能涉及到数据库操作,为服务器...

    mongols 文档手册.pdf

    Mongols的安装过程相对简单,只需要执行以下命令即可完成安装: ``` make clean && make -j2 && sudo make install && sudo ldconfig ``` 注意,由于Mongols需要C/C++编译器的支持,因此确保系统中已经安装了支持C11...

    libhv::fire: 比libevent、libuv更易用的国产网络库。A network library for developing TCPUDPHTTPWebSocket clientserver

    像libevent, libev, and libuv , libhv提供具有非阻塞IO和计时器的事件循环,但具有更简单的api和更丰富的协议。 :sparkles: 特征 跨平台(Linux,Windows,Mac,Solaris) EventLoop(IO,计时器,空闲) TCP ...

    scala-native-loop:可扩展的事件循环和面向Scala Native的面向异步IO; 由libuv提供支持

    本机循环(PRE-RELEASE) ...为了为实用的异步Scala Native程序提供一个有效的API,我们有两个子项目client和server ,它们通过集成其他C库分别提供了一个异步HTTP client和server: 用于请求解析,以及具有H

    C语言【通讯篇】TCP通讯实例-源码

    在C语言中,我们主要通过套接字(socket)API来实现TCP通讯。 一、创建套接字 在C语言中,使用`socket()`函数创建套接字。这个函数通常需要三个参数:协议族(AF_INET对应IPv4,AF_INET6对应IPv6),套接字类型...

    swoole-src-analysis, php swoole扩展的源码学习记录.zip

    Swoole提供了TCP和UDP服务器及客户端的API,可以轻松创建高性能的网络服务。这些接口包括启动、停止服务器,连接、断开客户端,以及收发数据等功能。 5. **HTTP服务器与WebSocket** Swoole支持构建HTTP服务器和...

    计算机网络高级软件编程技术.rar

    9. **RESTful API设计**:在构建网络服务时,遵循REST(Representational State Transfer)原则设计API,可以使服务更加易于理解和使用。 10. **错误处理与日志记录**:良好的错误处理机制和详尽的日志记录可以帮助...

    jwEngine:一个跨平台的c ++ <-> lua服务器快速解决方案

    6. **TCP Server**:基于传输控制协议的网络服务器,提供可靠的双向通信。 7. **Websocket**:提供全双工、低延迟的网络通信协议,适用于实时游戏场景。 8. **Game-Server** 和 **gameserver**:指代游戏服务器,...

    server

    8. **框架和库**:在实际开发中,往往使用现有的服务器框架,如Poco、libevent、libuv等,它们提供了丰富的功能和便利的API,帮助开发者快速构建高性能服务器。 9. **安全性**:服务器安全包括数据加密、防止SQL...

    nodejs-src

    在`libuv`库的支持下,Node.js实现了一个跨平台的事件循环机制。在源码中,我们可以看到`event_loop`的实现,它是整个系统的心脏,负责调度和执行事件回调。 Node.js的模块系统也是其核心特性之一。在`node-v...

Global site tag (gtag.js) - Google Analytics