libuv的官网:http:///。 关于libuv的介绍网上都有,大家可以去搜一下。 而如何在windows上安装libuv,我这边是使用vcpkg安装的,学习的时候极力推荐使用这种方式安装,关于vcpkg的使用可以参考这篇博客:https://blog.csdn.net/cjmqas/article/details/79282847。 libuv底层在windows使用的是IOCP机制,IOCP是个神器,但是学起来是真的难,学好了,用起来也就容易了,但是学好谈何容易。关于IOCP的介绍可以看这篇博客:https://blog.csdn.net/piggyxp/article/details/6922277。 综上所述,我就想在windows下试试使用libuv编写一个简单的服务器软件来测试测试libuv的性能,代码如下: #include <spdlog/spdlog.h> void OnClose(uv_handle_t* handle) // 接收socket数据前分配缓冲区函数回调函数 void ClientAlloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) buf->base = reinterpret_cast<char*>(malloc(suggested_size)); buf->len = suggested_size; void ClientRead(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) int nameLen = sizeof(sockaddr_in); // 当数据大于0时为接收数据,小于0时是客户端断开连接 char szIpAdderss[17] = { 0, }; uv_tcp_getpeername(reinterpret_cast<uv_tcp_t*>(stream), reinterpret_cast<sockaddr*>(&streamAddr), &nameLen); uv_ip4_name(&streamAddr, szIpAdderss, 17); spdlog::info('ip {0}, port {1}, data length {2}, data {3}', szIpAdderss, ntohs(streamAddr.sin_port), nread, buf->base); spdlog::error('ClientRead fail, {0}', uv_strerror(nread)); int nameLen = sizeof(sockaddr_in); char szIpAdderss[17] = { 0, }; uv_tcp_getpeername(reinterpret_cast<uv_tcp_t*>(stream), reinterpret_cast<sockaddr*>(&streamAddr), &nameLen); uv_ip4_name(&streamAddr, szIpAdderss, 17); spdlog::info('ip {0}, port {1} disconnect', szIpAdderss, ntohs(streamAddr.sin_port)); uv_close(reinterpret_cast<uv_handle_t*>(stream), OnClose); void OnConnect(uv_stream_t* server, int status) uv_tcp_t *pClient = reinterpret_cast<uv_tcp_t*>(malloc(sizeof(uv_tcp_t))); int retValue = uv_tcp_init(uv_default_loop(), pClient);; spdlog::error('uv_tcp_init fail, {0}', uv_strerror(retValue)); uv_close(reinterpret_cast<uv_handle_t*>(pClient), OnClose); int retValue = uv_accept(server, reinterpret_cast<uv_stream_t*>(pClient)); spdlog::error('uv_accept fail, {0}', uv_strerror(retValue)); uv_close(reinterpret_cast<uv_handle_t*>(pClient), OnClose); uv_read_start(reinterpret_cast<uv_stream_t*>(pClient), ClientAlloc, ClientRead); auto pLoop = uv_default_loop(); uv_tcp_init(pLoop, &server); int retValue = uv_ip4_addr('0.0.0.0', 43000, &bindAddr); spdlog::error('uv_ip4_addr fail, {0}', uv_strerror(retValue)); retValue = uv_tcp_bind(&server, reinterpret_cast<sockaddr*>(&bindAddr), 0); spdlog::error('uv_tcp_bind fail, {0}', uv_strerror(retValue)); retValue = uv_listen(reinterpret_cast<uv_stream_t*>(&server), 128, OnConnect); spdlog::error('uv_listen fail, {0}', uv_strerror(retValue)); return uv_run(pLoop, UV_RUN_DEFAULT);
测试的时候使用的是上面介绍IOCP的博客所提供的客户端,目的是对比使用IOCP写的服务器和使用libuv写的服务器之间的差异,结果看来是没多大差别的。 以上就是本博客的全文,本人限于能力,上文中难免有错误的地方,若读者发现上文的错误,请于评论区中指出,本人看到之后会立即修改的,谢谢。
|