欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > SRT Channel 源码分析

SRT Channel 源码分析

2024/12/22 1:18:30 来源:https://blog.csdn.net/fantasy_ARM9/article/details/144455045  浏览:    关键词:SRT Channel 源码分析

#include "platform_sys.h"

#include "udt.h"

#include "packet.h"

#include "socketconfig.h"

#include "netinet_any.h"

// CChannel 类的私有成员函数,用于创建 socket。

void createSocket(int family);

public:

// 返回当前通道的连接 ID,目前未实现。

std::string CONID() const { return ""; }

// CChannel 类的构造函数。

CChannel();

// CChannel 类的析构函数。

~CChannel();

// 打开一个 UDP 通道,使用提供的本地地址。

void open(const sockaddr_any& addr);

// 根据协议族打开一个 UDP 通道。

void open(int family);

// 基于现有的 UDP socket 描述符打开一个 UDP 通道。

void attach(UDPSOCKET udpsock, const sockaddr_any& adr);

// 断开并关闭 UDP 实体。

void close() const;

// 获取 UDP 发送缓冲区大小。

int getSndBufSize();

// 获取 UDP 接收缓冲区大小。

int getRcvBufSize();

// 查询通道使用的 socket 地址。

void getSockAddr(sockaddr_any& addr) const;

// 查询通道连接的对端 socket 地址。

void getPeerAddr(sockaddr_any& addr) const;

// 向指定地址发送数据包。

int sendto(const sockaddr_any& addr, srt::CPacket& packet, const sockaddr_any& src) const;

// 从通道接收数据包并记录源地址。

EReadStatus recvfrom(sockaddr_any& addr, srt::CPacket& packet) const;

// 设置配置选项。

void setConfig(const CSrtMuxerConfig& config);

// 获取 socket 选项。

void getSocketOption(int level, int sockoptname, char* pw_dataptr, socklen_t& w_len, int& w_status);

// 模板函数,用于获取 socket 选项的值。

template<class Type>

Type sockopt(int level, int sockoptname, Type deflt);

// 获取 IP Time To Live(生存时间)。

int getIpTTL() const;

// 获取 IP Type of Service(服务类型)。

int getIpToS() const;

#ifdef SRT_ENABLE_BINDTODEVICE

// 获取绑定到设备的名称。

bool getBind(char* dst, size_t len);

#endif

// 查询 ioctl 的类型。

int ioctlQuery(int type) const;

// 查询 socket 选项。

int sockoptQuery(int level, int option) const;

// 获取绑定地址的 const sockaddr 指针。

const sockaddr* bindAddress();

// 获取绑定地址的 sockaddr_any 引用。

const sockaddr_any& bindAddressAny();

private:

// 设置 UDP socket 选项。

void setUDPSockOpt();

private:

// socket 描述符。

UDPSOCKET m_iSocket;

// 可变成员,用于缓存原始设置值。

mutable CSrtMuxerConfig m_mcfg;

// 绑定地址。

sockaddr_any m_BindAddr;

//函数注释

// 定义一个名为 set_cloexec 的静态函数,它接受两个整型参数:文件描述符 fd 和一个布尔值 set。

static int set_cloexec(int fd, int set)

{

// 定义一个整型变量 r,用于存储函数的返回值。

int r;

// 循环执行 ioctl 系统调用,直到成功或遇到非 EINTR 错误。

do {

// 调用 ioctl 函数,根据 set 参数的值选择 FIOCLEX 或 FIONCLEX 命令。

// FIOCLEX:设置文件描述符为 close-on-exec,即在 exec 调用后关闭该文件描述符。

// FIONCLEX:取消设置文件描述符的 close-on-exec 属性。

e = ioctl(fd, set ? FIOCLEX : FIONCLEX); //这样创建fd, fork子进程时候会自动close

} while (r == -1 && errno == EINTR)

// 如果 r 不为 0(即 ioctl 调用失败),则返回 errno 值,表示错误原因。

if (r)

return errno;

// 如果成功设置,返回 0 表示成功。

return 0;

}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com