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进行编译)

  1. 下载libuv:https://github.com/libuv/libuv

  2. 下载gyp(https://github.com/turbulenz/gyp解压后放在libuv/build下

  3. gyp安装需要python环境,下载Python2.x(https://www.python.org/ftp/python/2.7.13/python-2.7.13.msi)安装并配置环境变量

  4. gyp安装:cmd进入libuv/build/gpy下,执行:setup.py install

  5. 打开vs2017编译工具,这里编译32位debug版本 (开始->vs2017->x86 tools,右键以管理员权限运行)

  6. libuv安装:切换到工程目录执行  vcbuild  vs2017

  7. 完成后,在工程Debug/lib下会生成.lib库,将工程的include和.lib库拷贝出来即可使用

2、linux下安装

  1. 下载libuv:https://github.com/libuv/libuv

  2. 解压 tar -zxvf libuv-v1.32.0.tar.gz

  3. 如果缺少libtool库的话,请安装  yum install libtool

  4.  sh autogen.sh   

  5. ./configure 

  6. make 

  7. make check (有错误可不理会)

  8. make install

  9. 创建软连接  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机制,应该也能实现,这里不做赘述

发布了155 篇原创文章 · 获赞 15 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/wangdamingll/article/details/101619464