#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();
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();
void getSockAddr(sockaddr_any& addr) const;
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* bindAddress();
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;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务