当前位置:C++技术网 > 资讯 > liuv网络编程问题

liuv网络编程问题

更新时间:2017-08-31 21:09:15浏览次数:1+次

最近在写一个测试程序.网络库我选择了libuv,需求就是创建多个客户端连接,模拟多用户情况.对服务器进行压力测试.

初始创建了2个uv_loop_t, 一个作为主线程loop, 一个工作者loop,工作者loop创建了一个线程单独处理逻辑, 工作者loop创建了2个定时器, 一个定时器用于监测是否有客户端可以连接服务器, 一个定时器用于发送缓冲区中的数据包.工作线程所产生的事件会通过uv_async_send投递给主线程处理. 除了发包逻辑用了uv_mutex_t互斥操作,其他操作都没加锁.所有创建的客户端连接都是绑定的工作者loop

出现的问题有:

1.频率很快的情况下 uv_close调用后, 回调函数没有触发 (连接服务器后, 主动断开连接)

2.运行一段时间后,就会出现数据读取异常,连接异常等情况.



C++技术网会员解答:

    您好,感谢您对C++技术网的支持与信任。

    libuv的核心思想就是回调机制,处处回调。一方面这种机制让程序处理变得容易,另一方面,却也带来一些不方便。很多操作都是只有回调函数被调用后,才表明功能执行完毕了。只要回调函数没有被调用,功能就没有执行完。这是因为里面用到了异步机制。所以第一个问题就是这种机制带来的不便。对于一个连接的处理,在关闭之前,我们要确保所有操作都得到合理的处理,否则会引发异常。比如资源泄露或者引发崩溃。因为只有回调函数被调用才是正常执行完毕了的。如果中途突然关闭了连接,这样就会引发混乱。所以我们一般是在回调函数里处理,而不要直接去关闭一个连接。当然这个只是建议。

   第二个问题,就是程序在运行一段时间后,连接异常了。我们有一个叫做心跳的东西。当一个连接如果长时间没有收发过数据,可能被底层中断掉,毕竟占着网络又不用,有点浪费资源。如果要想连接长期保持有效,可以设置libuv的保持活跃的参数。这个需要对libuv了解比较多。当然,如果对libuv不熟也没有关系,还有一种方法可以做到。那就是我们在应用层来做心跳机制。我们就利用定时器,定时发送一个很小的数据包,仅仅用来维持连接的可用性。只要有通信,libuv不会觉得网络只是占着不用,不会去关闭连接。使用很小的数据作为心跳包,间隔一定时间发一次,也不会对网络造成负担,却可以保持连接的活跃。

    具体的实现就请自己动手吧,参照这个思路可以试试。如果还有问题,请继续提问。