Groupsock的分析_1

来源:互联网 发布:零基础java就业班视频 编辑:程序博客网 时间:2024/05/03 12:58

      在进行Groupsock分析之前先复习下 组播(多播)的知识.

      首先组播 是基于 UDP的,所以在后面代码里面会出现:sock(AF_INET,SOCK_DGRAM,0); SOCK_DGARM就是代表是UDP进行通信。

然后组播是对应一个D网段的IP,我们需要加入组播才能向组播的成员发送数据或者接受数据,所以代码中会有setsockopt的调用(当然这个函数不光是针对加入组播的)。 最后需要注意的一点是,我们通讯 是在UDP(TCP)之上的某个端口上进行通讯的,所以我们组播的话必须有个固定的端口用于接受数据,也就是说我们要想组播里的成员发送数据,那么目的端口就是这个端口,而我们要接受组播成员发送的数据也是在这个端口上接受数据。

      对组播知识有了了解之后我们再来看看Groupsock的层次,Groupsock是从一个基类派生来的,这个基类是NetInterface,由于是基类,所以主要是一些标识性的属性,在NetInterface里面只有一个 UsageEnvironment类型的变量,很显然是为了错误处理和消息输出用的。

 

      NetInterface有2个子类,一个是DirectedNetInterface,另一个是Socket。

      DirectedNetInterface 这个类比较奇怪,首先它有2个纯虚函数,也就是说这个类是抽象类,但是这个抽象类却没有子类,也就是说在live555中 是不可能用到这个DirectedNetInterface类的。

 

      Socket这个抽象类,2个 字段:  fSocketNum和fPort,不用说肯定是 socket和 端口号了,但是问题来了,我们说了对于UDP通讯是半双工的,也就是说我们发送和接受数据必须在不同的端口号上,那么它们对应的又是什么呢,我的判断是 fSocketNum对应的是发送socket,fPort对应的是组播端口(接受端口)。因为后面会调用changePort修改fSocketNum对应的端口,作为通讯的双方我们 接受端口是不能随便变得,因为这涉及到两边达成协议。而且在changePort里面也没有修改fPort值,所以fPort肯定是接受端口了,对于组播来说就是组播的端口。

Socket这个类包含了几个操作(暂时不考虑构造和析构函数):

prot()  : 返回 fPort值。

sockNum():返回fSocketNum值。

changePort(...,Port port):把fSocketNum对应的端口号修改为新的端口号。

handleRead(...):这是一个纯虚函数 作用应该是接受数据了。

我们主要来说下 changePort这个函数:

首先是调用closeSocket(fSocketNum);关闭掉基于 fSocketNum的通讯,因为我们要在新的端口上通讯 肯定是要先关掉原来端口上的通讯。  接着调用 setupDatagramSocket(fEnv,newPort),在这个函数里面显示创建一个新的socket(注意是UDP的),然后进行一系列绑定(反正我们就假定它把自己的通讯端口改成新的端口来并且添加到了一个特定的组播里面去了)。最后调用TaskScheduler中的moveSocketHandling把HandleSet这个队列里面的相应节点的数据进行替换。

 

      Socket这个类说完了,我们再进一步来看下OutputSocket这个类,从名字上很容易看到这是一个 专门用于发送数据的类。

      的确OutputSocket是一个专门用于发送数据的类,所以它把从Socket基层下来的handleRead函数包装成了private 也就是说不向外提供接口的,而且handleRead的实现也只是 直接 return true;

      OutputSocket有3个字段 fSourcePort,fLastSentTTL和DebugLevel,后面2个字段一个用于TTL的一个用于Debug的我们无视它,直接来看 fSourcePort,注意我们前面提到了OutputSocket的基类Socket也有一个字段 fPort,而且经过分析fPort是接受端口,那么fSourcePort当然就是发送端口了,但是前面又有个函数 changePort,实际上changePort改变的端口就是fSourcePort,所以我觉得为了避免 在chagePort中改变了端口而 fSoucePort却没有同步改变,live555中要么在OutputSocket调用的过程中不用 changePort要么有一个机制用于 修改fSoucePort的。

       上面说了OutputSocket的字段,下面我们来看看OutputSocket包含的方法:

       首先构造函数OutputSocket(...,Port port):这地方提供的port是赋给fPort的,也就是告诉OutputSocket 接受端口是多少。

       soucePortNum: 返回fSourcePort的值。

       write(netAddressBits address,Port port,.............):通过fSocketNum给指定的地址和端口发送数据,并及时同步fSourcePort。

      我们主要来看write这个函数:

      在这个函数中首先是调用writeSocket实现数据的发送,在writeSocket中主要是调用了sendto来发送数据的。

     wirte调用的第二个函数是getSourcePort,在这个函数里面实现了把相应的socket绑定的端口赋值给fSourcePort。

      以上就是对Groupsock几个基类的分析了,后面会进一步对Groupsock的分析。

原创粉丝点击