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. HTTP Status Code [RFC]

    来源:http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml Hypertext Transfer Prot ...

  2. js数组操作【转载】

    用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多,自以为js高手的自己居然无从下手,一下狠心,我学!呵 ...

  3. TCP/IP协议详解 卷1—读书笔记(1)

    0. 前言 本系列简要记录该书的关键点,用以梳理知识点. 1. 简介 简述链路层下的一些相关协议,如以太网IP数据报,802标准,SLIP,CSLIP,PPP. 链路层主要为上层(IP)和本层(ARP ...

  4. 新版WampServer项目路径前面没有localhost

    1.第一种情况:http://localhost/页面中不能访问 解决方式: 在www目录下找到index.php 然后修改里面查找$projectContents 或直接查看338行代码 修改'ht ...

  5. RHEL-界面中文乱码问题

    一.虚拟机里的rhel更换为中文简体后,中文字符变为小方块 二.解决方法: 安装中文支持的软件包 fonts-chinese-3.02-12.el5.noarch.rpm fonts-ISO8859- ...

  6. jQ控制前端输入用户为空是的提醒

    1.在jQ中$(function(){})函数的意思是 $(document).ready(function(){}) 的简写,用来在DOM加载完成之后执行一系列预先定义好的函数 placeholde ...

  7. 【11-01】Sublime text 学习笔记

    >>>快捷键 CTRL+P ->根据文件名打开文件 “# 标识”“:行号” Ctrl+Shift+P -> 打开Package Control Ctrl+R ->查 ...

  8. iis7+ 禁止IP访问设置方法

    第一步:打开 管理工具-Internet 信息服务(IIS)管理器,打开网站,选中某个站点 第二步:双击IIS中的IP地址和域限制 第三步:在右栏操作,添加拒绝条目

  9. 黄永成-thinkphp讲解-个人博客讲解26集

    如果是要导入 前后台分组都公用的 第三方类库, 就将类库(*.class.php文件) 放在 App下的Class文件夹中. 导入方法是: import('Class.Image', APP_PATH ...

  10. EDW on Hadoop(Hadoop上的数据仓库)技术选型和实践思考

    在这篇文章中, 将讨论EDW on Hadoop 有哪些备选方案, 以及我个人的倾向性, 最后是建构方法.  欢迎转载, 但必须注明原贴(刘忠武,  http://www.cnblogs.com/ha ...