C网络库使用(一):libuv的安装、多线程tcp客户端、多线程tcp服务器的使用
·
参考网址:https://github.com/libuv/libuv/blob/master/README.md
https://www.cnblogs.com/cnxkey/articles/10058702.html
一、libuv的安装
1、windows下安装(这里使用vs2017进行编译)
-
下载libuv:https://github.com/libuv/libuv
-
下载gyp(https://github.com/turbulenz/gyp)解压后放在libuv/build下
-
gyp安装需要python环境,下载Python2.x(https://www.python.org/ftp/python/2.7.13/python-2.7.13.msi)安装并配置环境变量
-
gyp安装:cmd进入libuv/build/gpy下,执行:setup.py install
-
打开vs2017编译工具,这里编译32位debug版本 (开始->vs2017->x86 tools,右键以管理员权限运行)
-
libuv安装:切换到工程目录执行 vcbuild vs2017
-
完成后,在工程Debug/lib下会生成.lib库,将工程的include和.lib库拷贝出来即可使用
2、linux下安装
-
下载libuv:https://github.com/libuv/libuv
-
解压 tar -zxvf libuv-v1.32.0.tar.gz
-
如果缺少libtool库的话,请安装 yum install libtool
-
sh autogen.sh
-
./configure
-
make
-
make check (有错误可不理会)
-
make install
-
创建软连接 ln -s /usr/local/lib/libuv.so.1 /usr/lib64/libuv.so.1
二、libuv的使用
1)、windows下使用
1、创建vs2017 新项目
2、包含目录添加libuv头文件,库目录添加libuv的.lib库
3、附加依赖项添加所需的lib库 忽略LIBCMTD库造成的冲突
附加依赖项:
libuv.lib
ws2_32.lib
iphlpapi.lib
Userenv.lib
Psapi.lib
忽略特定的默认库:LIBCMTD
4、编译项目即可
2)linxu下使用
1、执行 g++ test.cpp -luv 即可
二、libuv多线程tcp客户端和服务器编程
可参考代码的网址:https://github.com/wangdamingll/libuv.git
代码是用vs2017编写的,如果在linux上编译错误 请自行去除平台差异头文件
这里需要去除 #include "pch.h",这是vs2017是用的头文件
1、多线程tcp客户端
请查看上面网址 LibuvClient.cpp 的文件
2、多线程tcp服务端
请查看上面网址 LibuvServer.cpp 的文件
三、libuv多线程tcp client/server思考
1、libuv官方给出的是单线程异步I/O的示例,正常来说应该够一般使用了,这里提供的多线程只是提供参考
2、libuv提供了uv_queue_work(),如果在服务器的accept之后,将任务推送给内部的线程池处理,但是由于tcp服务器的tcp数据是具有连续性的,采用上述方式的后果就是tcp数据可能不再有连续性,造成了乱序包,还需要添加其他逻辑去调整为正常的连续包,个人认为不可采取
3、我在官网上看到,libuv的函数,只有uv_async_send()函数是线程安全的,但是下面的代码(上面代码地址上的server):
应该也不是线程安全的了,但是我没有测试出来,望了解的大佬指教
4、采用多线程的弊端就是发送消息怎么发的问题,单线程异步I/O可以采用uv_async_send()触发回调然后发送,但是多线程就需要在工作线程和libuv多线程之间建立多条管道,将管道读事件注册到libuv循环中,通过工作线程往管道中写入一个字节的数据触发libuv所有线程或者指定线程的管道读事件进行发送,本人已经在linux上测试了管道事件,可以执行。windows上请自行添加。另外,采用libuv管道ipc机制,应该也能实现,这里不做赘述
更多推荐
已为社区贡献4条内容
所有评论(0)