首页 > 其他分享 >libuv网络操作

libuv网络操作

时间:2024-05-11 10:10:34浏览次数:9  
标签:uv 网络 tcp address interface 操作 buf libuv loop

1、获取本机网络地址

  使用uv_interface_addresses()可以获取本机网络地址接口信息,如下所示,其第一个参数是一个指针的指针,因为仅传递指针的话函数内只能改变指针指向的内容,不能改变该指针值,有了指针的地址就可以改变指针的值:

#include <stdio.h>
#include <uv.h>

int main() {
    char buf[512] = {0};
    uv_interface_address_t* info;
    int count, i;

    //int uv_interface_addresses(uv_interface_address_t** addresses, int* count);
    uv_interface_addresses(&info, &count); //获得所有网口信息
    i = count;

    printf("Number of interfaces: %d\n", count);
    while (i--) {
        uv_interface_address_t addrInterface = info[i]; 

        printf("Name: %s\n", addrInterface.name);
        printf("Internal? %s\n", addrInterface.is_internal ? "Yes" : "No"); //是否是内部IP

        if (addrInterface.address.address4.sin_family == AF_INET) { //IPV4
            uv_ip4_name(&addrInterface.address.address4, buf, sizeof(buf));
            printf("IPv4 address: %s\n", buf);
        }
        else if (addrInterface.address.address4.sin_family == AF_INET6) { //IPV6
            uv_ip6_name(&addrInterface.address.address6, buf, sizeof(buf));
            printf("IPv6 address: %s\n", buf);
        }

        printf("\n");
    }

    uv_free_interface_addresses(info, count);
    return 0;
}

2、TCP服务

  如下实现了一个TCP Server:

#include "uv.h"
#include <assert.h>

uv_loop_t* loop;

void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) {
    *buf = uv_buf_init((char*)malloc(suggested_size), suggested_size);
}

void on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
    if (nread > 0) { //读取到数据
        fprintf(stdout, "reveive data: %s\n", buf->base);
    }
    else if (nread < 0) { //套接字关闭或发生错误
        fprintf(stderr, "Read error: %s\n", uv_strerror(nread));
        
        if (nread == UV_EOF) { /*套接字被关闭(end of file)*/
            
        }
        else  if (nread == UV_ENOBUFS) { //alloc_buf() returned a buffer of length 0

        }

        uv_close((uv_handle_t*)stream, NULL);
    }
    else { //there is no more reading left
       
    }

    if (buf->base)
        free(buf->base);
}

void on_new_connection(uv_stream_t* server, int status) {
    if (status < 0) {
        fprintf(stderr, "New connection error: %s\n", uv_strerror(status));
        // error!
        return;
    }

    uv_tcp_t* client = (uv_tcp_t*)malloc(sizeof(uv_tcp_t));
    uv_tcp_init(loop, client); //初始化连接套接字
    if (uv_accept(server, (uv_stream_t*)client) == 0) { //建立连接
        uv_read_start((uv_stream_t*)client, alloc_buffer, on_read); //读取数据
    }
    else { //error
        uv_close((uv_handle_t*)client, NULL);
    }
}

int main()
{
    loop = uv_default_loop();

    uv_tcp_t server;
    uv_tcp_init(loop, &server); //初始化监听套接字

    sockaddr_in addr;
    uv_ip4_addr("0.0.0.0", 6000, &addr); //将ip地址和端口号转换为sockaddr_in结构,转换使用uv_ip4_name()
    uv_tcp_bind(&server, (const struct sockaddr*)&addr, 0); //绑定IP地址和端口号

    int r = uv_listen((uv_stream_t*)&server, SOMAXCONN, on_new_connection); //设置监听模式,有新的连接到来时,调用回调函数on_new_connection
    if (r) {
        fprintf(stderr, "Listen error: %s\n", uv_strerror(r));
        return 1;
    }

    return uv_run(loop, UV_RUN_DEFAULT);
}

3、其它 

  libuv中实现TCP客户端、UDP应用、域名解析功能,可以参考:libuv中文教程—网络

 

标签:uv,网络,tcp,address,interface,操作,buf,libuv,loop
From: https://www.cnblogs.com/milanleon/p/18184469

相关文章

  • 揭秘网络故障的幕后黑手:流量探针如何助您快速排查网络问题
    网络故障就像潜藏在暗处的幽灵,时不时跳出来影响我们的工作和生活。面对突如其来的网络问题,我们常常手足无措,不知从何下手进行排查。而流量探针,就像侦探手中的放大镜,可以帮助我们洞悉网络流量的真相,快速定位并解决问题。流量探针:网络故障排查的利器流量探针是一种网络流量分析工......
  • 面向单片机的超轻量级的神经网络推理库+单片机上实现动态加载功能的函数库
    1、TinyMaix-面向单片机的超轻量级的神经网络推理库TinyMaix是专为低资源的单片机设计的AI神经网络推理框架,通常被称为TinyML。TinyMaix可以让你在任意单片机上运行轻量级深度学习模型。TinyMaix的设计原则:易用性>移植性>速度>空间。TinyMaix其实是矽速科技(Sipee......
  • react 中在componentDidMount中进行网络请求的原因
    1,在constructor请求组件未挂载也可以发送请求,这里所影响的时间只有执行发送请求的时间,然后组件接着渲染,等异步数据返回后,再执行 setState然后render重新渲染constructor执行一次没错但是网络请求是异步的 先用默认值渲染 网络请求回来后setState后重新render2,在compon......
  • 计算机基础-网络
    一、网络设备a.网卡(无线、有线)物理层:提供物理地址,也叫MAC地址b.网线(双绞线)、光缆c.交换机、集线器arp链路层:提供局域网内计算机与路由器之间建立端口映射,mac与IP的链路绑定d.路由器网络层:为局域网内计算机分配IP地址、防火墙、上网限制、网速控制登录e.服务器传输层:为局......
  • Docker 必知必会2----跟我一步步来执行基本操作
    通过前文(https://www.cnblogs.com/jilodream/p/18177695)的了解,我们已经大致明白了什么是docker,为什么要用docker,以及docker的基本设计思路是什么。今天来看下,docker的基本操作有哪些?1、linux下安装docker首先我们来安装docker,如下是使用centos7的安装办法,其他系统可以自行搜......
  • 多机操作系统
    受长久以来市场宣传的影响,目前的操作系统被定义在“单机操作系统”范畴里。即运行在一台计算机上,管理一台计算机的软硬件资源,应用软件使用本地硬件资源的操作系统。操作系统的另一种范式:多机操作系统,却很少有人知道和研究。多机操作系统是借助网络连接,运行在多台计算机、管理多台......
  • 记一次网络诈骗者站点的全过程与套路分析
    这是一则漫长又跌宕起伏的故事,小伙伴们请随意就坐,自备茶点;全文包含信息收集与攻克的详细全过程,以及对该类型诈骗思路的分析拆解,以提高防范意识;0x00梦的开始那是一个阳光明媚的晌午,日常的搬砖过程中收到一封公司邮件,看到这熟悉的措辞,又瞄了一眼下面的附件内容,熟悉的气息扑面而来,就......
  • 网络编程
    1.IO模型2.网络编程IO调用分2个阶段:数据准备、数据copy.BIO:同步阻塞,一个连接一个线程,第一阶段等待,直到有数据了,该线程copy并返回,等到的过程一直浪费资源,优化:用连接池多线程,不用新建、销毁线程,直接拿池子里现成的。NIO:同步非阻塞,多个连接注册到多路复用器Selector上通......
  • node.js 封装操作文件类
    constfs=require('fs');constpath=require('path');classFile{constructor(fileName,name,ext,isFile,size,createTime,updateTime){this.fileName=fileName;this.name=name;this.ext=ext;......
  • 一种基于光电容积波的血压测量神经网络算法,开源、低功耗、低成本的人工智能软硬件提
    具体的软硬件实现点击http://mcu-ai.com/MCU-AI技术网页_MCU-AI人工智能心血管疾病是最严重的死亡原因之一,每年在全世界造成严重的生命损失。持续监测血压似乎是最可行的选择,但这需要一个侵入性的过程,带来了几层复杂性。这促使我们开发一种方法,通过使用光体积描记图(PPG)信号的非......