精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
网站首页
技术服务
技术中心
开源优势
英语优势
服务流程
典型客户
服务分类
软件开发
商业项目优势
产品列表
服务流程
典型客户
软件开发培训
在线教育
连锁培训
高校合作
兴趣
科研
就业
企业合作
人才委托培训
HR整体外包
关于我们
公司理念
公司荣誉
公司架构
人才招聘
视频下载
软件开发培训高品质源自卓越软件开发能力
高端企业级软件开发培训模式,承诺掌握软件开发工作经验
软件开发在线教育品质出众和软件开发培训实地面授效果一致
软件开发培训诚信经营
当前位置:
锐英源
/
开源技术
/
基于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-2024 锐英源软件
统一社会信用代码:91410105098562502G 豫ICP备08007559号 最佳分辨率 1440*900
地址:郑州市金水区文化路97号郑州大学北区院内南门附近