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. 10月21日下午PHP常用函数

    函数四要素:返回类型  函数名  参数列表  函数体 //最简单的函数定义方式 function Show() { echo "hello"; } Show();//输出结果为he ...

  2. Spring解析

    Spring还是蛮有技术含量的,可以自己用代码实践一遍,找了一篇实践的案例: http://qingwengang.iteye.com/blog/621678 先mark下,等后面有时间了实践一遍. ...

  3. Java 组播

    MulticastSocketServer.java package cn.edu.buaa.multicast; import java.io.IOException; import java.ne ...

  4. codeforces 719C (复杂模拟-四舍五入-贪心)

    题目链接:http://codeforces.com/problemset/problem/719/C 题目大意: 留坑...

  5. hasClass addClass removeClass

    //函数有class function hasClass(ele,cls){ return -1<(" "+ele.className+" ").inde ...

  6. thinkphp 语言包丢失

    Thinkphp 语言包丢失 造成的原因有那些 1.复制模板 预览时内容出现英文状态 如:show.html 解决:找到lang ,在zh-cn 复制想对应的文件包 改下名称就有可以 如:admin_ ...

  7. 一个 Sql语句优化的问题- STATISTICS 统计信息

    前段时间,同事遇到一个 Sql语句的问题,一个列表分页功能响应在30 s以上,看数据库里面的数据条数,数据量也不大,相关字段的一些索引也都有,可就是慢.于是找出具体的sql 语句出来分析,分页功能主要 ...

  8. HDInsight 指定输出目录 insert overwrite

    基本语法 insert overwrite local directory '/example/demo/' select * from table; 可以格式化输出 insert overwrite ...

  9. 在VS2013中强制IIS Express应用程序池使用经典模式

    直接在文件夹地址栏输入 %userprofile%\documents\iisexpress\config\applicationhost.config 会打开上边的配置文件 将 <siteDe ...

  10. jQuery 取值、赋值的基本方法

    转载:http://www.cnblogs.com/huanhuan86/archive/2012/06/13/2548071.html 获取元素的value值: /*获得TEXT.AREATEXT的 ...