libuv使用笔记
获取libuv
官网http://libuv.org/
下载列表https://dist.libuv.org/dist/
git仓库https://github.com/libuv/libuv
笔者从git仓库直接clone下来的,
最新的TAG是1.44.1,切一下tag
$ git checkout v1.44.1
编译
$ ./autogen.sh
./autogen.sh: 1: ./autogen.sh: automake: not found
./autogen.sh: 33: test: Illegal number:
./autogen.sh: 34: test: Illegal number:
+ libtoolize --copy
./autogen.sh: 43: ./autogen.sh: libtoolize: not found
报错了,蛋蛋,没有工具,先装工具
$ sudo apt-get install autoconf automake libtool
$ ./autogen.sh
...
生成了configure文件,但是我看到CMakeLists.txt,我什么不直接用CMake编译呢?
因为没有看完README.md, 直接跟着做了。
个人比较喜欢CMake编译,重新来。
$ mkdir -p build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=./out/
$ make -j4
$ make install
$ cd out
$ tree
.
├── include
│ ├── uv
│ │ ├── aix.h
│ │ ├── bsd.h
│ │ ├── darwin.h
│ │ ├── errno.h
│ │ ├── linux.h
│ │ ├── os390.h
│ │ ├── posix.h
│ │ ├── stdint-msvc2008.h
│ │ ├── sunos.h
│ │ ├── threadpool.h
│ │ ├── tree.h
│ │ ├── unix.h
│ │ ├── version.h
│ │ └── win.h
│ └── uv.h
├── lib
│ ├── cmake
│ │ └── libuv
│ │ ├── libuvConfig.cmake
│ │ └── libuvConfig-noconfig.cmake
│ ├── libuv_a.a
│ ├── libuv.so -> libuv.so.1
│ ├── libuv.so.1 -> libuv.so.1.0.0
│ ├── libuv.so.1.0.0
│ └── pkgconfig
│ ├── libuv.pc
│ └── libuv-static.pc
└── share
└── doc
└── libuv
└── LICENSE
9 directories, 24 files
编译比较顺利
测试
官方给的HelloWorld代码http://docs.libuv.org/en/v1.x/guide/basics.html#hello-world
#include <stdio.h>
#include <stdlib.h>
#include <uv.h>
int main()
{
uv_loop_t *loop = (uv_loop_t *)malloc(sizeof(uv_loop_t));
uv_loop_init(loop);
printf("Now quitting.\n");
uv_run(loop, UV_RUN_DEFAULT);
uv_loop_close(loop);
free(loop);
return 0;
}
编译一下,找不到库,加一下动态库查找路径,下面是我点电脑上编译的libuv路径,注意修改
export LD_LIBRARY_PATH=/home/liuyuelong/workspace/libuv.git/build/out/lib:$LD_LIBRARY_PATH
不知道代码干了嘛,反正编译运行都OK,说明编译的库没有问题。
用户手册
用户手册http://docs.libuv.org/en/v1.x/guide.html
TCP服务端监听
之前把Helloworld搞定了,接下来搞个TCP服务端玩玩
http://docs.libuv.org/en/v1.x/guide/networking.html#server
这个手册代码感觉都不全,什么鬼。
不管,搞起来再说。
#include <stdio.h>
#include <stdlib.h>
#include <uv.h>
#include "sys/socket.h"
#define DEFAULT_PORT 8060
#define DEFAULT_BACKLOG SOMAXCONN
void on_new_connection(uv_stream_t *server, int status)
{
printf("on_new_connection:%s\n", status);
}
int main()
{
sockaddr_in addr;
auto loop = uv_default_loop();
uv_tcp_t server;
uv_tcp_init(loop, &server);
uv_ip4_addr("0.0.0.0", DEFAULT_PORT, &addr);
uv_tcp_bind(&server, (const struct sockaddr *)&addr, 0);
int r = uv_listen((uv_stream_t *)&server, DEFAULT_BACKLOG, on_new_connection);
if (r)
{
fprintf(stderr, "Listen error %s\n", uv_strerror(r));
return 1;
}
return uv_run(loop, UV_RUN_DEFAULT);
}
backlog这个值找了半天,都忘记了,我直接使用了#include "sys/socket.h"中定义的SOMAXCONN;
在on_new_connection中做了断点,用浏览器敲地址,触发一下,回调中断点被触发了,挺好,索命TCP进来了。
接受客户端
改造回调函数
void on_new_connection(uv_stream_t *server, int status)
{
printf("on_new_connection:%s\n", status);
}
TCP服务端通讯
监听搞定了,怎么通讯呢?