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;

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值