libuv 使用点滴

对于一个纯C语言实现的网络库来说,libuv 作为Node的跨平台抽象层,有着良好的性能,有Node 这个成熟项目提供营养,其可用性有了保障。但有些地方还是比较晦涩。

最近在写一个C/S架构项目,服务器端和客户端均采用了libuv作为网络库,在编写服务器的时候,Server端极少情况会出现莫名其妙的崩溃现象。经过多次调试,发现崩溃的时机一般是服务器正在发送一个大数据,比如发送一个文件,而客户端此时突然关闭,或者网络断开的时候。

对于网络断开事件 libuv没有设计专门的回调函数来进行处理,而是在 uv_read_start 所指定的回调函数中产生一个onread事件,通过 指定参数 nread < 0 来表示网络发生了断开事件.

当连接断开时 服务器会根据断开原因,收到 UV_EOF 或者 UV_ECONNRESET 事件, 而此时 uv_tcp 已经不能再用作写出数据。否则会产生一个异常。因此 正确的做法是 当收到 UV_EOF 的时候应当立即调用 uv_close() 来关闭连接。而非使用 uv_shutdown.

你可能感兴趣的:(服务器,C语言)