前面说了Groupsock的基类,现在来整体的分析下Groupsock:
首先是:
removeAllDestination
removeDestination
addDestination
changeDestinationParamters
这4个成员函数,这几个函数都是跟一个 destRecord链表关联的,成员变量 fDests指向这个链表的表头。
从字面意思基本可以得到,removeAllDestination是删除所有节点,removeDestination是删除指定节点。addDestination是添加节点(如果该节点不在链表中),changeDestinationParameters是改变fDests的参数。这个链表里面存放的都是组播地址,以及组播端口。
第二组函数是:
groupAddress:返回fIncomingGroupEid的组播地址
sourceFilterAddress:返回fIncomingGroupEid 的过滤源地址(ssm:源指定多播)
isSSM: 判断fIncomingGroupEid是否为SSM,即判断souceFilterAddress是否有效。
在构造函数里面把fIncomingGroupEid对应的节点插入到了 fDests指向的链表中了。
几个辅助函数:
ttl :得到fTTL的值(这个可以无视,因为我们不用关心TTL)
multicastSendOnly:(无关紧要,用于离开多播组的,而且在程序里面通过#if 0 直接掉过来函数体)
wasLoopedBackFromUs:判断我们接受到的消息是否是 从本机而且是同一个端口发出的,防止自循环
write:(这个函数在前面提到过,是从OutputSocket继承来的)用于fSocketNum向指定的地址和端口发送数据。
sockNum :(前面提到的函数)用于得到fSocketNum。
port:(前面提到的函数)用于得到fPort
env:(前面提到的函数)用于得到fEnv,用于错误或者信息输出
sourcePortNum:(前面提到的函数)用于得到fSourcePort
changePort:(前面提到的函数)用于改变fSocketNum绑定的端口
发送和接受数据的函数:
outPut:通过循环调用write把给定消息依次发送到fDests指向的链表的各个组播地址,并记录状态(通过statsIncoming和statsGroupIncoming)
handleRead:通过fSocketNum读取消息,后面调用了outputToAllMembersExcept函数(这个函数没看明白,不知道干嘛用的)。
outputToAllMembersExcept:(没看明白)
其它函数:
两个构造函数和一个析构函数
members:返回fMembers,这个成员变量是DirectedNetInterfaceSet类型,这是一个容器,里面有一个hashtable结构。(这个变量在outputToAllMembersExcept函数里面用到,所以同样也没发现起什么作用。
上面的就是对Groupsock的主要分析了,groupsock里面涉及到socket方面的函数调用都在 groupHelper.cpp里面实现了,以后再看网络编程方面的 groupHelper.cpp肯定是一个很好的资料了(今天看了他通过令TTL=0,得到自己的ip,貌似挺不错的)