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)。根据envgroupsockPriv成员来确定重用标识。如果groupsockPriv为空则使用默认设置。

setupDatagramSocket创建一个数据报形式的socket套接口,如果端口port 0,且ReceivingInterfaceAddrINADDR_ANY的时候,不进行绑定(bind)。否则若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源码阅读(四)网络的更多相关文章

  1. 39 网络相关函数(七)——live555源码阅读(四)网络

    39 网络相关函数(七)——live555源码阅读(四)网络 39 网络相关函数(七)——live555源码阅读(四)网络 简介 14)readSocket从套接口读取数据 recv/recvfrom ...

  2. 40 网络相关函数(八)——live555源码阅读(四)网络

    40 网络相关函数(八)——live555源码阅读(四)网络 40 网络相关函数(八)——live555源码阅读(四)网络 简介 15)writeSocket向套接口写数据 TTL的概念 函数send ...

  3. 38 网络相关函数(六)——live555源码阅读(四)网络

    38 网络相关函数(六)——live555源码阅读(四)网络 38 网络相关函数(六)——live555源码阅读(四)网络 简介 12)makeSocketNonBlocking和makeSocket ...

  4. 35 网络相关函数(三)——live555源码阅读(四)网络

    35 网络相关函数(三)——live555源码阅读(四)网络 35 网络相关函数(三)——live555源码阅读(四)网络 简介 5)NoReuse不重用地址类 6)initializeWinsock ...

  5. 34 网络相关函数(二)——live555源码阅读(四)网络

    34 网络相关函数(二)——live555源码阅读(四)网络 34 网络相关函数(二)——live555源码阅读(四)网络 2)socketErr 套接口错误 3)groupsockPriv函数 4) ...

  6. 33 网络相关函数(一)——live555源码阅读(四)网络

    33 网络相关函数(一)——live555源码阅读(四)网络 33 网络相关函数(一)——live555源码阅读(四)网络 简介 1)IsMulticastAddress多播(组播)地址判断函数 多播 ...

  7. 36 网络相关函数(四)——live555源码阅读(四)网络

    36 网络相关函数(四)——live555源码阅读(四)网络 36 网络相关函数(四)——live555源码阅读(四)网络 简介 7)createSocket创建socket方法 8)closeSoc ...

  8. 32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络

    32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络 32 GroupSock(AddressPortLookupTable)——live555 ...

  9. 31 GroupSock(AddressString)——live555源码阅读(四)网络

    31 GroupSock(AddressString)——live555源码阅读(四)网络 31 GroupSock(AddressString)——live555源码阅读(四)网络 简介 Addre ...

随机推荐

  1. Java对象的多态性(转型)

    多态性在面向对象中主要有两种体现: <1>方法的重载与覆写 <2>对象的多态性 对象的多态性:向上转型:子类对象-->父类对象,向上转型会自动完成 向下转型:父类对象-- ...

  2. notification的使用

    示例: NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); No ...

  3. HDU 1326 Box of Bricks(水~平均高度求最少移动砖)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1326 题目大意: 给n堵墙,每个墙的高度不同,求最少移动多少块转使得墙的的高度相同. 解题思路: 找到 ...

  4. 数字图像处理- 3.4 空间滤波 and 3.5 平滑空间滤波器

    3.4 空间滤波基础 • Images are often corrupted by random variations in intensity, illumination, or have poo ...

  5. thinkphp删除

    $result = M('content')->where('id>0')->delete $result =M('content')->where(array('id'=&g ...

  6. js日历插件 中文、英文日历

    日历插件 来源网站:http://www.cnblogs.com/yank/archive/2008/08/14/1267746.html 六款英文日历 http://www.bobd.cn/desi ...

  7. 注入问题0x00

    1.sqlmap遇到MySQL注入可以成功getshell,但是,遇到sqlserver注入未成功getshell. 2.xp_cmdshell 如何 getshell(1433未对外开放). 解决方 ...

  8. [c#]获取exchange中的图片

    摘要 在exchange 2007或者2010中获取的邮件内容为html标签格式,也就是一个页面.如果里面含有img标签,你会发现img标签的src属性为cid:xxxxxxxxxxxx的一串字符串, ...

  9. 【转】随机函数 rand() srand() 以及seed的原理

    from:http://blog.csdn.net/feige2008/article/details/6943885   标准库<cstdlib>(被包含于<iostream> ...

  10. 从零学习storm(一) 环境的安装配置

    1.首先 安装zookeeper   2.安装Java环境   3.安装Python   下载python包,编译安装     1.解压      2.configure     3.make     ...