libuv学习-udp传输

这篇具有很好参考价值的文章主要介绍了libuv学习-udp传输。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. udp传输的例子

1. udp 服务器的例子

/*
 libuv udp server
*/
#include <uv.h>
#include <stdio.h>
#include <stdlib.h>

void on_alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) {
    // Allocate a buffer for receiving data
    buf->base = (char*)malloc(suggested_size);
    buf->len = suggested_size;
}

void on_recv_data(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) {
    if (nread < 0) {
        // Error occurred while receiving data
        fprintf(stderr, "Error: %s\n", uv_strerror(nread));
        free(buf->base);
        return;
    }

    if (nread > 0) {
        // Process the received data
        printf("Received data: %s\n", buf->base);
    }

    free(buf->base);
}

int main() {
    uv_loop_t* loop = uv_default_loop();

    uv_udp_t server;
    uv_udp_init(loop, &server);

    struct sockaddr_in addr;
    uv_ip4_addr("0.0.0.0", 12345, &addr);

    uv_udp_bind(&server, (const struct sockaddr*)&addr, UV_UDP_REUSEADDR);

    uv_udp_recv_start(&server, on_alloc_buffer, on_recv_data);

    return uv_run(loop, UV_RUN_DEFAULT);
}

libuv学习-udp传输,libuv学习,实时音视频

2. udp 客户端的例子

/*
    libuv udp client
*/
#include <uv.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
int main() {
    uv_loop_t* loop = uv_default_loop();

    uv_udp_t socket;
    uv_udp_init(loop, &socket);

    uv_udp_send_t send_req;
    uv_buf_t buffer;
    const char* message = "Hello, server!";
    buffer = uv_buf_init(const_cast<char*>(message), strlen(message));

    struct sockaddr_in server_addr;
    uv_ip4_addr("127.0.0.1", 12345, &server_addr);

    uv_udp_send(&send_req, &socket, &buffer, 1, (const struct sockaddr*)&server_addr, nullptr);

    uv_run(loop, UV_RUN_DEFAULT);

    uv_loop_close(loop);
    return 0;
}

libuv学习-udp传输,libuv学习,实时音视频

3. nc命令模拟udp client

libuv学习-udp传输,libuv学习,实时音视频

二. 代码解析

结构体解析

uv_udp_t

struct uv_udp_s {
  UV_HANDLE_FIELDS
  /* read-only */
  /*
   * Number of bytes queued for sending. This field strictly shows how much
   * information is currently queued.
   */
  size_t send_queue_size;
  /*
   * Number of send requests currently in the queue awaiting to be processed.
   */
  size_t send_queue_count;
  UV_UDP_PRIVATE_FIELDS
};
typedef struct uv_udp_s uv_udp_t;

uv_udp_t 结构体 是用于UDP通信的抽象数据类型。它代表了一个UDP套接字,用于在网络上发送和接收UDP数据包。
uv_udp_t 结构体包含了一系列用于配置和管理UDP套接字的成员变量,以及一系列用于操作UDP套接字的函数。

uv_buf_t

typedef struct uv_buf_t {
  char* base;
  size_t len;
} uv_buf_t;

uv_buf_t 结构体表示一个用于存储数据的缓冲区,通常用于在异步 I/O 操作中传递数据。
包含两个变量:
base:指向存储数据的缓冲区的起始位置的指针。
len:表示缓冲区的长度,即缓冲区中可用于存储数据的字节数。

uv_udp_send_t

struct uv_udp_send_s {
  UV_REQ_FIELDS
  uv_udp_t* handle;
  uv_udp_send_cb cb;
  UV_UDP_SEND_PRIVATE_FIELDS
};
typedef struct uv_udp_send_s uv_udp_send_t;

uv_udp_send_t 结构体代表了一个 UDP 发送请求,用于发送 UDP 数据包。它被用于异步地发送 UDP 数据包到目标地址。

函数解析

uv_udp_init

int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle);
这个函数用于初始化 UDP 套接字,并将其与事件循环关联。
在调用这个函数之后,handle 参数所指向的 uv_udp_t 结构体实例将被初始化,并且可以用于进行 UDP 相关的操作。

uv_ip4_addr

int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr);
这个函数将 IPv4 地址和端口转换为网络字节顺序,并填充到 sockaddr_in 结构体中。

形参解析:
ip:一个字符串,表示 IPv4 地址。可以是点分十进制格式的 IP 地址,也可以是域名(例如:“127.0.0.1” 或 “localhost”)。
port:一个整数,表示端口号。
addr:一个指向 sockaddr_in 结构体的指针,用于存储转换后的 IPv4 地址和端口信息。

uv_udp_bind

int uv_udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int flags);

这个函数是将一个 UDP 套接字绑定到指定的本地地址和端口,以便可以接收和发送数据。

形参解析:
handle:一个指向已初始化的 uv_udp_t 结构体实例的指针,表示要绑定的 UDP 套接字。
addr:一个指向 sockaddr 结构体的指针,表示要绑定的本地地址和端口。
flags:用于指定绑定选项的标志uv_udp_flags

uv_udp_recv_start

int uv_udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb);

这个函数用于通知 libuv 开始监听指定 UDP 套接字上的数据包,并指定一个回调函数来处理接收到的数据。

形参解析:
handle:一个指向已初始化的 uv_udp_t 结构体实例的指针,表示要开始接收数据的 UDP 套接字。
alloc_cb:一个回调函数,用于分配内存以存储接收到的数据。它的原型为 void (alloc_cb)(uv_handle_t handle, size_t suggested_size, uv_buf_t* buf)。
recv_cb:一个回调函数,用于处理接收到的数据。它的原型为 void (recv_cb)(uv_udp_t handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags)。

uv_udp_send

int uv_udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, uv_udp_send_cb send_cb);

这个函数将数据包异步发送到指定的目标地址。
形参解析:
req:一个指向 uv_udp_send_t 结构体实例的指针,表示发送请求。在发送完成后,该结构体将被 libuv 使用来通知发送结果。
handle:一个指向已初始化的 uv_udp_t 结构体实例的指针,表示要使用的 UDP 套接字。
bufs:一个指向 uv_buf_t 结构体数组的指针,表示要发送的数据。每个 uv_buf_t 结构体表示一个数据缓冲区,可以包含一部分要发送的数据。
nbufs:一个无符号整数,表示 bufs 数组中数据缓冲区的数量。
addr:一个指向 sockaddr 结构体的指针,表示要发送数据的目标地址。
send_cb:一个回调函数,用于处理发送结果。它的原型为 void (send_cb)(uv_udp_send_t req, int status)文章来源地址https://www.toymoban.com/news/detail-836838.html

参考

libuv官方文档

https://libuv-docs-chinese.readthedocs.io/zh/latest/

chatgpt

https://chat.openai.com/

到了这里,关于libuv学习-udp传输的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音视频--视频数据传输

    H264码流RTP封装方式详解:https://blog.csdn.net/water1209/article/details/126019272 H264视频传输、编解码----RTP协议对H264数据帧拆包、打包、解包过程: https://blog.csdn.net/wujian946110509/article/details/79129338 H264之NALU解析: https://zhuanlan.zhihu.com/p/409527359 注意:H264帧数据打包进入RTP packet时会把s

    2024年02月13日
    浏览(36)
  • 音视频实时通话解决方案

    想要实现音视频通话,对于大部分人可能会觉得很难,但是实际上,有些事情并没有大家想的那样困难,只要功夫深,铁杵磨成针。 机缘巧合下,在业务中,我也遇到了一个业务场景需要实现音视频通话,我们不可能自己从零开始干,我本次用到的核心是WebRTC。 WebRTC (Web R

    2024年02月12日
    浏览(46)
  • Sora:新一代实时音视频通信框架

             Sora 是一个开源的实时音视频通信框架,旨在提供高效、稳定、可扩展的音视频通信解决方案。 它基于 WebRTC技术 ,支持跨平台、跨浏览器的实时音视频通信,并且具备低延迟、高并发、易集成等特点。         --点击进入Sora(一定要科学哦,不会的私信)  目录

    2024年02月22日
    浏览(56)
  • 使用FFmpeg将本地文件通过UDP推流的音视频

    推流是指将音视频数据通过网络传输到指定的目标端,而FFmpeg是一个功能强大的跨平台多媒体处理工具,可以用于音视频编解码、转码、处理等操作。本文将介绍如何使用FFmpeg将本地文件通过UDP协议进行推流,实现音视频数据的传输。 首先,需要确保已经安装了FFmpeg工具。如

    2024年03月19日
    浏览(64)
  • iOS 端实现1对1音视频实时通话

    首先,我们来看一下 iOS 端是如何获取访问音视频设备权限的。相比 Android 端而言,iOS端获取相关权限要容易很多。其步骤如下: 打开项目,点击左侧目录中的项目。 在左侧目录找到 info.plist ,并将其打开。 点击 右侧 看到 “+” 号的地方。 添加 Camera 和 Microphone 访问权限。

    2024年02月15日
    浏览(50)
  • 使用Sora部署实时音视频通信应用实战项目

              本项目将构建一个在线教学平台,实现教师与学生之间的实时音视频通信。 平台将提供教师上传课件、发起授课邀请,学生加入课堂、实时互动等功能。通过使用 Sora ,我们将确保音视频通信的稳定、流畅和低延迟。 目录 一、项目概述 二、准备工作 三、集成

    2024年02月20日
    浏览(54)
  • 乐鑫ESP-RTC 实时音视频通信方案

    乐鑫 ESP-RTC 实时音视频通信方案 乐鑫科技推出 ESP-RTC (Real-Time Communication) 音视频通信方案,能够实现稳定流畅、超低延时的语音和视频实时通信。 ESP-RTC 以乐鑫 ESP32-S3-Korvo-2 多媒体开发板为核心。ESP32-S3-Korvo-2 搭载 ESP32-S3 AI SoC,拥有双麦克风阵列,支持近/远场语音唤醒和

    2023年04月14日
    浏览(45)
  • 【新知实验室】——腾讯云TRTC实时音视频体验

    【新知实验室】——腾讯云TRTC实时音视频体验 前言 一、腾讯实时音视频TRTC是什么? 二、DEMO体验 1.注册腾讯云账号 2.使用实时音视频(需先开通) 3.查看项目(查看密钥和快速上手操作) 4.运行快速上手项目(静态页面) 随着短视频行业的不断发展,人们对实时音视频的需

    2024年02月11日
    浏览(41)
  • 【新知实验室】TRTC腾讯实时音视频动手实验

    https://cloud.tencent.com/document/product/647/16788 应用 TRTC 通过应用的形式来管理不同的业务或项目。您可以在 TRTC 控制台 给不同的业务或项目分别创建不同的应用,从而实现业务或项目数据的隔离。每个腾讯云账号最多可以创建100个 TRTC 应用。 SDKAppID SDKAppID(应用标识/应用 ID)是腾

    2024年02月01日
    浏览(49)
  • Golang 流媒体音视频网络传输开源项目-LAL

    lal是开源直播流媒体网络传输项目,主要由三部分组成: lalserver:流媒体转发服务器。类似于 nginx-rtmp-module 等服务,但支持更多的协议,提供更丰富的功能。 demo:一些小应用,比如推、拉流客户端,压测工具,流分析工具,调度示例程序等。类似于ffmpeg、ffprobe等应用。

    2023年04月16日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包