锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / 基于UDP的数据传输协议UDT / UDT源码剖析 UDT : socket()过程代码注释
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

UDT源码剖析(六):UDT::socket()过程代码注释


调用路线
UDT::socket()->CUDT::socket()->CUDTUnited::newSocket()
1 UDTSOCKET CUDT::socket(int af, int type, int)
2 {
3 // 如果垃圾收集没启动,那么这里自动调用startup
4 // 所以手动调用startup其实不是必须的,但是为了接受作者的风格,我们也养成这样的习惯吧
5 // 起码startup你可以在启动时就调用,这可以让第一次创建Socket的过程显得快一些
6 if (!s_UDTUnited.m_bGCStatus)
7 s_UDTUnited.startup();
8
9 try
10 {
11 // 直接调用Socket单元的newSocket
12 return s_UDTUnited.newSocket(af, type);
13 }
14 catch (CUDTException& e)
15 {
16 s_UDTUnited.setError(new CUDTException(e));
17 return INVALID_SOCK;
18 }
19 catch (bad_alloc&)
20 {
21 s_UDTUnited.setError(new CUDTException(3, 2, 0));
22 return INVALID_SOCK;
23 }
24 catch (...)
25 {
26 s_UDTUnited.setError(new CUDTException(-1, 0, 0));
27 return INVALID_SOCK;
28 }
29 }
1 UDTSOCKET CUDTUnited::newSocket(const int& af, const int& type)
2 {
3 // 只允许SOCK_STREAM和SOCK_DGRAM两种类型
4 // 前面说sendfile和recvfile的时候说了这两个类型会被转化为UDT自己的类型,下面会看到转化的地方
5 if ((type != SOCK_STREAM) && (type != SOCK_DGRAM))
6 throw CUDTException(5, 3, 0);
7
8 // 声明一个新的Socket指针
9 CUDTSocket* ns = NULL;
10
11 try
12 {
13 // 创建Socket对象
14 ns = new CUDTSocket;
15
16 // 创建Socket的core对象
17 ns->m_pUDT = new CUDT;
18
19 // 根据ipv4、ipv6的标准设置初始地址信息
20 if (AF_INET == af)
21 {
22 ns->m_pSelfAddr = (sockaddr*)(new sockaddr_in);
23 ((sockaddr_in*)(ns->m_pSelfAddr))->sin_port = 0;
24 }
25 else
26 {
27 ns->m_pSelfAddr = (sockaddr*)(new sockaddr_in6);
28 ((sockaddr_in6*)(ns->m_pSelfAddr))->sin6_port = 0;
29 }
30 }
31 catch (...)
32 {
33 delete ns;
34 throw CUDTException(3, 2, 0);
35 }
36
37 // 加锁分配ID,然后解锁,ID初始为随机数,然后逐次减一
38 CGuard::enterCS(m_IDLock);
39 ns->m_SocketID = -- m_SocketID;
40 CGuard::leaveCS(m_IDLock);
41
42 // 设置状态为INIT
43 ns->m_Status = INIT;
44 // 监听SocketID为0,说明目前为独立Socket
45 ns->m_ListenSocket = 0;
46 // 设置Core的SocketID
47 ns->m_pUDT->m_SocketID = ns->m_SocketID;
48 // 这里进行自己的类型映射转换
49 ns->m_pUDT->m_iSockType = (SOCK_STREAM == type) ? UDT_STREAM : UDT_DGRAM;
50 // 协议版本,ipv4或者ipv6
51 ns->m_pUDT->m_iIPversion = ns->m_iIPversion = af;
52 // UDT网络信息的缓存,这个对象在CUDTUnited构造时创建,在CUDTUnited对象析构时销毁
53 ns->m_pUDT->m_pCache = m_pCache;
54
55 // protect the m_Sockets structure.
56 // 将这个新的socket加入socket列表,如果加入过程中有任何异常,则socket创建失败
57 // 注意这个CUDTUnited,我们叫它Socket单元,是一个socket的管理器
58 // 而非单个socket业务对象,这个逻辑我们以后再分析
59 CGuard::enterCS(m_ControlLock);
60 try
61 {
62 m_Sockets[ns->m_SocketID] = ns;
63 }
64 catch (...)
65 {
66 //failure and rollback
67 delete ns;
68 ns = NULL;
69 }
70 CGuard::leaveCS(m_ControlLock);
71
72 // 判断socket对象指针是否正常
73 if (NULL == ns)
74 throw CUDTException(3, 2, 0);
75
76 // 返回新socket的ID
77 return ns->m_SocketID;
78 }
友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内