37 网络相关函数(五)——live555源码阅读(四)网络
37 网络相关函数(五)——live555源码阅读(四)网络
本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso
简介
网络相关函数是一系列用于操作网络数据的函数。在多个文件中都有相关的函数的定义。还有一些函数是系统socket API
相关函数,就不提了。
这一系列的函数大多有一个特点,需要一个UsageEnvironmet&型的参数。
这些方法大多在live555sourcecontrol\groupsock\include\GroupsockHelper.hh
中声明。
10)MAKE_SOCKADDR_IN构建sockaddr_in结构体宏
#ifdef HAVE_SOCKADDR_LEN
#define SET_SOCKADDR_SIN_LEN(var) var.sin_len = sizeof var
#else
#define SET_SOCKADDR_SIN_LEN(var)
#endif // sockaddr_in var,使用adr和prt为其赋值(AF_INET)
#define MAKE_SOCKADDR_IN(var,adr,prt) /*adr,prt must be in network order*/\
struct sockaddr_in var;\
var.sin_family = AF_INET;\
var.sin_addr.s_addr = (adr);\
var.sin_port = (prt);\
SET_SOCKADDR_SIN_LEN(var);
11)setupDatagramSocket设置数据报套接口
setupDatagramSocket
函数有两个参数(UsageEnvironment& env, Port port)
。根据env
的groupsockPriv
成员来确定重用标识。如果groupsockPriv
为空则使用默认设置。
setupDatagramSocket
创建一个数据报形式的socket
套接口,如果端口port 0
的时候,不进行绑定(,且
ReceivingInterfaceAddrINADDR_ANYbind
)。否则若port==0
的时候,绑定ReceivingInterfaceAddr
(不为INADDR_ANY
)和端口0
(内核选择端口)。不为0
的时候绑定INADDR_ANY
(内核选择IP
)和端口port
。
绑定完成之后设置多播发生接口。如果全局的SendingInterfaceAddr== INADDR_ANY
则不设置。
函数成功返回一个socket
套接口句柄,失败返回-1
。
// 设置数据报套接字
int setupDatagramSocket(UsageEnvironment& env, Port port) {
// 初始化网络
if (!initializeWinsockIfNecessary()) {
socketErr(env, "Failed to initialize 'winsock': ");
return -;
}
// 创建数据报套接字
int newSocket = createSocket(SOCK_DGRAM);
if (newSocket < ) {
socketErr(env, "unable to create datagram socket: ");
return newSocket;
}
// 获取env的groupsockPriv重新使用标识
int reuseFlag = groupsockPriv(env)->reuseFlag;
// 根据需要,为env释放groupsockPriv成员指向对象
reclaimGroupsockPriv(env); // 设置允许重用本地地址和端口,reuseFlag用来接受传出值
if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEADDR,
(const char*)&reuseFlag, sizeof reuseFlag) < ) {
socketErr(env, "setsockopt(SO_REUSEADDR) error: ");
closeSocket(newSocket);
return -;
} #if defined(__WIN32__) || defined(_WIN32)
// Windoze doesn't properly handle SO_REUSEPORT or IP_MULTICAST_LOOP
// win-doze 贬义,可能是由于操作系统BUG很多,而且运行速度慢,导致在运行的是后你会DOZE(打瞌睡)
// Windows无法正确的处理SO_REUSEPORT或 IP_MULTICAST_LOOP
#else
#ifdef SO_REUSEPORT //在定义了重新使用端口宏下设置
if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEPORT,
(const char*)&reuseFlag, sizeof reuseFlag) < ) {
socketErr(env, "setsockopt(SO_REUSEPORT) error: ");
closeSocket(newSocket);
return -;
}
#endif #ifdef IP_MULTICAST_LOOP //在定义了IP多播循环下设置
const u_int8_t loop = ;
if (setsockopt(newSocket, IPPROTO_IP, IP_MULTICAST_LOOP,
(const char*)&loop, sizeof loop) < ) {
socketErr(env, "setsockopt(IP_MULTICAST_LOOP) error: ");
closeSocket(newSocket);
return -;
}
#endif
#endif
// Note: Windoze requires binding, even if the port number is 0
// Windows 需要绑定,即使端口号是0
netAddressBits addr = INADDR_ANY; // 设置绑定地址是任意网口IP
#if defined(__WIN32__) || defined(_WIN32)
#else
if (port.num() != || ReceivingInterfaceAddr != INADDR_ANY) {
//ReceivingInterfaceAddr是一个全局的定义,默认是INADDR_ANY
#endif
if (port.num() == ) addr = ReceivingInterfaceAddr;
// 组建sockaddr_in结构体
MAKE_SOCKADDR_IN(name, addr, port.num());
// 绑定socket套接口和sockaddr地址
if (bind(newSocket, (struct sockaddr*)&name, sizeof name) != ) {
char tmpBuffer[];
sprintf(tmpBuffer, "bind() error (port number: %d): ",
ntohs(port.num()));
socketErr(env, tmpBuffer);
closeSocket(newSocket);
return -;
}
#if defined(__WIN32__) || defined(_WIN32)
#else
}
#endif // Set the sending interface for multicasts, if it's not the default:
// 设置多播发送接口,如果它不是默认的:
if (SendingInterfaceAddr != INADDR_ANY) {
struct in_addr addr;
addr.s_addr = SendingInterfaceAddr;
// 设置多播接口
if (setsockopt(newSocket, IPPROTO_IP, IP_MULTICAST_IF,
(const char*)&addr, sizeof addr) < ) {
socketErr(env, "error setting outgoing multicast interface: ");
closeSocket(newSocket);
return -;
}
} return newSocket;
}
37 网络相关函数(五)——live555源码阅读(四)网络的更多相关文章
- 39 网络相关函数(七)——live555源码阅读(四)网络
39 网络相关函数(七)——live555源码阅读(四)网络 39 网络相关函数(七)——live555源码阅读(四)网络 简介 14)readSocket从套接口读取数据 recv/recvfrom ...
- 40 网络相关函数(八)——live555源码阅读(四)网络
40 网络相关函数(八)——live555源码阅读(四)网络 40 网络相关函数(八)——live555源码阅读(四)网络 简介 15)writeSocket向套接口写数据 TTL的概念 函数send ...
- 38 网络相关函数(六)——live555源码阅读(四)网络
38 网络相关函数(六)——live555源码阅读(四)网络 38 网络相关函数(六)——live555源码阅读(四)网络 简介 12)makeSocketNonBlocking和makeSocket ...
- 35 网络相关函数(三)——live555源码阅读(四)网络
35 网络相关函数(三)——live555源码阅读(四)网络 35 网络相关函数(三)——live555源码阅读(四)网络 简介 5)NoReuse不重用地址类 6)initializeWinsock ...
- 34 网络相关函数(二)——live555源码阅读(四)网络
34 网络相关函数(二)——live555源码阅读(四)网络 34 网络相关函数(二)——live555源码阅读(四)网络 2)socketErr 套接口错误 3)groupsockPriv函数 4) ...
- 33 网络相关函数(一)——live555源码阅读(四)网络
33 网络相关函数(一)——live555源码阅读(四)网络 33 网络相关函数(一)——live555源码阅读(四)网络 简介 1)IsMulticastAddress多播(组播)地址判断函数 多播 ...
- 36 网络相关函数(四)——live555源码阅读(四)网络
36 网络相关函数(四)——live555源码阅读(四)网络 36 网络相关函数(四)——live555源码阅读(四)网络 简介 7)createSocket创建socket方法 8)closeSoc ...
- 32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络
32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络 32 GroupSock(AddressPortLookupTable)——live555 ...
- 31 GroupSock(AddressString)——live555源码阅读(四)网络
31 GroupSock(AddressString)——live555源码阅读(四)网络 31 GroupSock(AddressString)——live555源码阅读(四)网络 简介 Addre ...
随机推荐
- 基本药目录sop
http://db.yaozh.com/basicdir 基本药物 编辑 "基本药物"的概念, 由世界卫生组织于1977年提出,指的是能够满足基本医疗卫生需求,剂型适宜.保证供应. ...
- Java工厂设计模式
程序在接口和子类之间加入一个过渡类,通过此过渡类端取得接口的实例化对象,一般都会称这个过渡端为工厂类 //=============================================== ...
- .NET软件开发与常用工具清单(转)
http://www.cnblogs.com/smileberry/p/4047835.html
- 在Linux主机上搭建SVN,用于同步提交修改,实现本地提交线上预览(SVN Hook功能实现)
原文地址: http://blog.csdn.net/ROVAST/article/details/44887707?ref=myread 注:上文中钩子使用中有错误,正确的使用如下,上文中忘记了up ...
- LVS简介
LVS 编辑 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一 ...
- 怎样让Oracle支持中文? 语言_地域.字符集
暂时不涉及数据库业务,但是今天入库的时候中文入库报错,考虑可能是字体不支持,留待备用. 来源:Linux社区 作者:robertkun 语言_地域.字符集SIMPLIFIED CHINESE_CHI ...
- centos 安装 mysql5.6
转载自 http://www.cnblogs.com/littlehb/archive/2013/04/02/2995007.html Mysql 5.5以后使用了CMake进行安装,参考与以前的区别 ...
- R语言 奇怪的NA
> 1+NA [1] NA > NA==1 [1] NA > c(NA,1:50) [1] NA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- 一段可以使用的 hibernate获得对象->action存入List->jsp页面用<s:iterator>迭代的代码
SelectAction.java @SuppressWarnings("serial") @Component("selectAction") @Scope( ...
- C++模板学习
一.定义函数模板 template<class T> 函数定义 举个例子比较两个数大小: template<class T> int Compare(T a,T b) { ; ...