专利名称:一种支持ipv4和ipv6双协议栈网络通信模块的实现方法
技术领域:
本发明涉及计算机网络通信技术领域,尤其涉及一种支持互联网协议第4版(Internet Protocol version 4,IPv4)和互联网协议第6版(InternetProtocol version 6,IPv6)双协议栈网络通信模块的实现方法。
背景技术:
现有的互联网主要是在IPv4协议的基础上运行的。IPv6协议是下一版本的互联网协议,它的提出最初是因为随着互联网的迅速发展,IPv4协议定义的有限地址空间将被耗尽,而地址空间的不足必将影响互联网的进一步发展。为了彻底解决互联网的地址危机,Internet工程任务组(IETF)在20世纪90年代中期提出了拥有128位地址的IPv6互联网协议,并在1998年进行了进一步的标准化工作。除了对地址空间的扩展以外,还对IPv6协议地址的结构重新做了定义,采用了与IPv4协议中使用的CIDR类似的方法分配地址。IPv6协议还提供了自动配置以及对移动性、安全性和可扩展性的更好支持等新的特性。
目前,IPv6协议已经成熟并形成了Internet标准(草案)请求注解(Request for Comments,RFC)文本,作为IPv4协议的唯一取代者的地位已经得到了世界的一致认可。国内外各大通信设备厂商都在IPv6协议的应用与研究方面投入了大量的人力和财力,并开发出了相应的软硬件。例如,早在2001年美国思科公司就正式在其路由器、交换机上支持IPv6协议,如今已经积累了丰富的实践经验。当今绝大多数Unix/Linux系统也都支持IPv6协议,它们都可以实现IPv4/IPv6双栈运行,有的还具有手工或自动隧道功能。美国微软公司从Win2000开始推出IPv6 Tech Preview,并在Windows XP上内置了商用IPv6协议,6.0以上版本的IE软件也支持IPv6协议。
我国政府对互联网信息技术的发展和应用非常重视,启动了一系列的研究项目。2002年,作为全球IPv6论坛的成员单位,BII与信息产业部电信研究院电信传输所联合发起并启动了IPv6电信试验网(IPv6 TelecomTrial Net,6TNet),开展了许多开拓性的研究。2003年8月,由发改委、工程院、信息产业部和教育部以及六大运营商等组织的国家下一代互联网(China Next Generation Internet,CNGI)项目目前正在进行当中,且已经建成初期的试验网。总之,IPv6协议的应用环境已经逐步成熟,相信很快会进入企业应用。
当然,尽管从长远看IPv6协议有利于互联网的持续和长久发展,但其也并非十全十美、一劳永逸,也不可能解决所有问题。IPv6协议只能在发展中不断完善,不可能在一夜之间发生,过渡需要时间和成本。另外,IPv4和IPv6协议并不兼容,因此以二者之一为标准设计的程序和系统,无法与以另一个为标准设计的程序和系统进行通信。
现在普遍认同的观点是,IPv6协议不可能在短时间内取代IPv4协议,IPv6和IPv4协议将长期共存。原因主要有以下两个方面一方面,随着IPv6协议环境的日益成熟,要求现有的广泛存在的大量的基于IPv4协议的软件和系统需要进行移植和升级的工作,以使之可以支持IPv6协议。
另一方面,新开发或者新出现的应用在设计和实现的过程中充分考虑对IPv6协议支持的同时,也要求不能忽略对IPv4协议环境下运行的满足。
由于上述两方面的原因,决定了在IPv4与IPv6协议将长期共存的今天,在网络通信相关的程序设计和开发过程中需要设计一个方便简洁的过渡方法,使得应用在网络升级的过程中可以同时在IPv4和IPv6协议环境下工作。
尽管现有的网络软件/系统大多仅支持以IPv4协议通信,但是目前已经存在一定数量的网络软件/系统可以做到同时支持以IPv4和IPv6协议通信。可遗憾的是,他们并未能提供一个较通用的、能够同时支持IPv4/IPv6协议通信功能的接口,以使得网络应用程序开发者可以无需关心IPv4和IPv6协议通信的底层细节就能轻松编制支持IPv4/IPv6双栈通信的程序。
当前所存在的支持V4/V6双栈通信功能的设计方法大致可分为以下两种一种是混合方式,一种是分离方式。
在混合方式中,设计者将IPv4和IPv6两种通信功能在一个模块内实现,即在模块内部处理IPv4与IPv6协议通信的差异。这种方式可以用于全新的支持V4/V6双栈通信的网络软件/系统的设计与开发,但是并不能很好的满足现有的基于IPv4协议的网络软件/系统向IPv6协议环境下的移植与升级的要求。
在分离方式中,设计者分别应用两个单独的通信功能模块实现所需的IPv4通信功能和IPv6通信功能,应用层网络程序开发者需要在代码书写过程中自己负责区分IPv4和IPv6协议功能接口的差异。这种方式有利于现有的基于IPv4协议的网络软件/系统的向IPv6协议环境的移植与升级,但是对于新的网络应用开发而言其尤其不便,应用层网络程序开发者在代码实现过程中,需要充分熟悉底层的IPv4和IPv6协议的通信细节以及功能接口的差异。
因此,在向IPv6协议过渡期间,为了更好的满足的现有网络应用程序的移植与升级以及新的网络应用程序的设计与实现,迫切需要有一种好的设计方法,一套统一的同时支持IPv4和IPv6的双协议栈的网络通信模块,其最终可使得网络通信程序开发人员,尤其是仅关注上层应用的网络应用层业务开发人员,无需关心冗繁的Socket参数选择和设定以及底层具体的网络通信细节。
发明内容
(一)要解决的技术问题针对上述现有技术存在的不足,本发明的主要目的在于提供一种支持IPv4和IPv6双协议栈网络通信模块的实现方法,以满足在开发支持IPv4和IPv6双协议栈网络应用程序或系统过程中对统一底层通信功能接口的迫切需求。
(二)技术方案为达到上述目的,本发明的技术方案是这样实现的一种支持IPv4和IPv6双协议栈网络通信模块的实现方法,该方法包括
A、设计和实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类;B、在所实现抽象接口父类的基础上,分别设计和实现支持IPv4和IPv6协议通信功能的接口类。
所述网络通信模块用于完成网络通信中客户端功能部分,且网络通信模块在Linux平台下设计和实现,所述步骤A包括利用面向对象的设计思想,根据上层用户的实际需求为抽象接口父类至少设计如下公共Public成员连接远程服务器的接口ConnectServ、断开与该远程服务器之间连接的接口DisConnectServ、发送数据的接口SendData、接收数据的接口RcvData、设置建立连接超时时间的接口SetTimeout和释放所有缓冲区的接口ReleaseBuf,实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类CClient。
所述抽象接口父类CClient的Public成员至少包括以下接口连接远程服务器的接口ConnectServ、断开与该远程服务器之间连接的接口DisConnectServ、发送数据的接口SendData、接收数据的接口RcvData、设置建立连接超时时间的接口SetTimeout和释放所有缓冲区的接口ReleaseBuf。
所述网络通信模块用于完成网络通信中客户端功能部分,且网络通信模块在windows平台下设计和实现,所述步骤A包括利用面向对象的设计思想,根据上层用户的实际需求为抽象接口父类至少设计如下Public成员检查套接字winsock是否已经初始化的接口IsInit、初始化winsock的接口Init、连接远程服务器的接口ConnectServ、断开与该远程服务器之间连接的接口DisConnectServ、发送数据的接口SendData、接收数据的接口RcvData、设置建立连接超时时间的接口SetTimeout和释放所有缓冲区的接口ReleaseBuf,实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类CClient。
所述抽象接口父类CClient的Public成员至少包括以下接口检查套接字winsock是否已经初始化的接口IsInit、初始化winsock的接口Init、连接远程服务器的接口ConnectServ、断开与该远程服务器之间连接的接口DisConnectServ、发送数据的接口SendData、接收数据的接口RcvData、设置建立连接超时时间的接口SetTimeout和释放所有缓冲区的接口ReleaseBuf。
步骤B中所述设计和实现支持IPv4协议通信功能的接口类包括利用面向对象的设计思想,根据抽象接口父类CClient的规范至少设计IPv4下的发送和接收数据套接字的属性SOCKET mySocket、存储当前连接端口号的属性unsigned int port、存储消息头的属性SMsgHead MsgHead、存储当前序列号的属性unsigned int CurrSeq、检查Winsock是否已经初始化的接口bool HasInit、检查套接字状态超时时间的接口timeval timeout、存放接收数据链表的接口CList Result_BuftList、为消息体加消息头的组包接口SData MakePackage和将消息体和消息头分开的拆包接口charunpack,实现支持IPv4协议网络通信程序设计所需的抽象接口类CClientV4。
步骤B中所述设计和实现支持IPv6协议通信功能的接口类包括利用面向对象的设计思想,根据抽象接口父类CClient的规范至少设计IPv6下的发送和接收数据套接字的属性SOCKET mySocket、存储当前连接端口号的属性unsigned int port、存储消息头的属性SMsgHead MsgHead、存储当前序列号的属性unsigned int CurrSeq、检查Winsock是否已经初始化的接口bool HasInit、检查套接字状态超时时间的接口timeval timeout、存放接收数据链表的接口CList Result_BuffList、为消息体加消息头的组包接口SData MakePackage和将消息体和消息头分开的拆包接口charunPack,实现支持IPv6协议网络通信程序设计所需的抽象接口类CClientV6。
所述网络通信模块用于完成网络通信中服务器端功能部分,所述步骤A包括利用面向对象的设计思想,根据上层用户的实际需求为抽象接口父类至少设计如下公共Public成员用于启动线程的接口Start、用于暂停线程的接口Stop,用于终止线程并释放资源的接口Release、用于获取接收数据包链表中第一个数据包的接口GetFirstRcvData、用于删除接收数据包链表中第一个数据包的接口DelFirstRcvData、用于设置超时时间的接口SetTimeout和用于设置侦听最大连接数的接口SetMaxConn,实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类CSrvThread。
所述抽象接口父类CSrvThread的Public成员至少包括以下接口用于启动线程的接口Start、用于暂停线程的接口Stop,用于终止线程并释放资源的接口Release、用于获取接收数据包链表中第一个数据包的接口GetFirstRcvData、用于删除接收数据包链表中第一个数据包的接口DelFirstRcvData、用于设置超时时间的接口SetTimeout和用于设置侦听最大连接数的接口SetMaxConn。
步骤B中所述设计和实现支持IPv4协议通信功能的接口类包括利用面向对象的设计思想,根据抽象接口父类CSrvThread的规范至少设计IPv4下的侦听套接字的属性SOCKET LstSocket、默认值为系统所允许最大连接数的属性int MaxConn、存储本地地址的属性sockaddr LocalAddr、存储本地端口的属性unsigned int LocalPort、用于表明已开启接收数据线程链表的属性CList ThreadList、存放接收数据包链表的属性CListRcvData_List、初始化winsock并绑定本地地址开始监听的接口boolStartUp和终止ThreadList中线程并释放空间的接口void CleanUp,实现支持IPv4协议网络通信程序设计所需的抽象接口类CSrvLstV4Thread。
步骤B中所述设计和实现支持IPv6协议通信功能的接口类包括利用面向对象的设计思想,根据抽象接口父类CSrvThread的规范至少设计IPv6下的侦听套接字的属性SOCKET LstSocket、默认值为系统所允许最大连接数的属性int MaxConn、存储本地端口的属性unsigned intLocalPort、用于表明已开启接收数据线程链表的属性CList ThreadList、存放接收数据包链表的属性CList RcvData_List、初始化winsock并绑定本地地址开始监听的接口bool StartUp和终止ThreadList中线程并释放空间的接口void CleanUp,实现支持IPv4协议网络通信程序设计所需的抽象接口类CSrvLstV6Thread。
步骤B中所述设计和实现支持IPv4和IPv6协议通信功能的接口类,根据IPv4和IPv6底层Socket函数接口和使用方法的不同,分别继承步骤A中所设计和实现的抽象接口父类,且沿照统一的接口格式进行。
(三)有益效果从上述技术方案可以看出,本发明具有以下有益效果1、利用本发明,通过设计和实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类,然后在所实现抽象接口父类的基础上,分别设计和实现支持IPv4和IPv6协议通信功能的接口类,提供了一种支持IPv4和IPv6双协议栈网络通信模块的实现方法,满足了在开发支持IPv4和IPv6双协议栈网络应用程序或系统过程中,对统一底层通信功能接口的迫切需求。
2、利用本发明,通过采用本发明提供的支持IPv4和IPv6双协议栈的网络通信模块,很好的屏蔽了底层利用IPv4协议与IPv6协议通信的差异,使上层开发人员能直接使用该套统一的接口进行开发,而无需关心和处理IPv4协议与IPv6协议通信的差别。
3、本发明整合了混合方式和分离方式等现有双协议栈通信程序设计方法各自的优点,应用面向对象的思想和方法,通过将按照统一接口的要求分别独立实现的IPv4协议和IPv6协议通信功能模块封装成为通用的网络通信模块,使网络通信程序开发人员,尤其是仅关注上层应用的网络应用层业务开发人员,无需关心冗繁的Socket参数选择和设定以及底层具体的网络通信细节,满足了在开发支持IPv4和IPv6双协议栈网络应用程序或系统过程中,对统一底层通信功能接口的迫切需求。
4、本发明提供了一套完整的、核心的且简单易用的API接口,网络通信程序开发人员利用这些API接口,无需关心冗繁的Socket参数选择和设定以及底层具体的网络通信细节,可以直接开发支持IPv4和IPv6双协议栈网络应用程序或系统,大大方便了网络通信程序开发人员的使用,非常有利于本发明的广泛推广和应用。
5、在本发明中,多数通信操作接口被设计和实现为virtual类型,以支持和实现在具体应用中的动态绑定。同时,上层应用程序开发者还可以根据本发明的基本思想,针对自己的应用程序通信协议,在本套基本接口的基础上轻松地进行扩展。因此,非常有利于本发明的广泛推广和应用。
6、利用本发明,在用户需要的情况下,可以以较小的代价实现将现有只支持IPv4协议通信的应用软件或系统升级为同时支持IPv4和IPv6协议通信。
图1为本发明设计支持IPv4和IPv6双协议栈网络通信模块总体技术方案的实现流程图。
具体实施例方式
为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明进一步详细说明。
本发明的核心思想是抽象、提炼、设计并实现一组通用的、可完成底层网络通信功能的抽象接口父类,然后在所实现抽象接口父类的基础上,分别设计和实现支持IPv4和IPv6协议通信功能的接口类,实现了支持IPv4和IPv6双协议栈的网络通信模块。
如图1所示,本发明设计支持IPv4和IPv6双协议栈网络通信模块总体技术方案的实现流程图,该方法包括以下步骤步骤101设计和实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类;步骤102在所实现抽象接口父类的基础上,分别设计和实现支持IPv4和IPv6协议通信功能的接口类。
上述步骤101中所述设计和实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类,根据具体使用中担当的服务器或客户端角色的不同,可分为以下两种情况进行一种情况是网络通信模块用于完成网络通信中客户端功能部分,另一种情况是网络通信模块用于完成网络通信中服务器端功能部分。
对于网络通信模块用于完成网络通信中客户端功能部分,本发明中网络通信模块可以在Linux平台下设计和实现,也可以在windows平台下设计和实现。
当网络通信模块在Linux平台下设计和实现时,所述步骤101包括利用面向对象的设计思想,根据上层用户的实际需求为抽象接口父类至少设计如下公共的Public成员连接远程服务器的接口ConnectServ、断开与该远程服务器之间连接的接口DisConnectServ、发送数据的接口SendData、接收数据的接口RcvData、设置建立连接超时时间的接口SetTimeout和释放所有缓冲区的接口ReleaseBuf,实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类CClient。
所述抽象接口父类CClient的Public成员至少包括以下接口连接远程服务器的接口ConnectServ、断开与该远程服务器之间连接的接口DisConnectServ、发送数据的接口SendData、接收数据的接口RcvData、设置建立连接超时时间的接口SetTimeout和释放所有缓冲区的接口ReleaseBuf。
当网络通信模块在windows平台下设计和实现时,所述步骤101包括利用面向对象的设计思想,根据上层用户的实际需求为抽象接口父类至少设计如下公共的Public成员检查套接字winsock是否已经初始化的接口IsInit、初始化winsock的接口Init、连接远程服务器的接口ConnectServ、断开与该远程服务器之间连接的接口DisConnectServ、发送数据的接口SendData、接收数据的接口RcvData、设置建立连接超时时间的接口SetTimeout和释放所有缓冲区的接口ReleaseBuf,实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类CClient。
所述抽象接口父类CClient的Public成员至少包括以下接口检查套接字winsock是否已经初始化的接口IsInit、初始化winsock的接口Init、连接远程服务器的接口ConnectServ、断开与该远程服务器之间连接的接口DisConnectServ、发送数据的接口SendData、接收数据的接口RcvData、设置建立连接超时时间的接口SetTimeout和释放所有缓冲区的接口ReleaseBuf。
下面以C++语言为例,对设计和实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类CClient进行详细说明。class CClient{Private:……………………Public:
CClient();
~CClient();
virtual bool IsInit(); //检查winsock是否初始化了virtual void Init();//初始化winsockvirtual char*ConnectServ(char*IP,int_port); //连接服务器virtual bool DisConnectServ(int port);//断开连接,并释放socket所占资源virtual void SendData(char*data,int len); //发送数据virtual char*RcvData(); //接收数据virtual void SetTimeout(int sec,int usec); //设置连接超时时间virtual void ReleaseBuf(char*buff); //释放所有的缓冲区…………};
其中,多数通信操作接口被设计和实现为virtual类型,以支持和实现在具体应用中的动态绑定。同时,上层应用程序开发者还可以根据本发明的基本思想,针对自己的应用程序通信协议,在本套基本接口的基础上轻松地进行扩展。
对于网络通信模块用于完成网络通信中客户端功能部分,步骤102中所述设计和实现支持IPv4协议通信功能的接口类包括利用面向对象的设计思想,根据抽象接口父类CClient的规范至少设计IPv4下的发送和接收数据套接字的属性SOCKET mySocket、存储当前连接端口号的属性unsigned int port、存储消息头的属性SMsgHeadMsgHead、存储当前序列号的属性unsigned int CurrSeq、检查Winsock是否已经初始化的接口bool HasInit、检查套接字状态超时时间的接口timevaltimeout、存放接收数据链表的接口CList Result_BuffList、为消息体加消息头的组包接口SData MakePackage和将消息体和消息头分开的拆包接口char unPack,实现支持IPv4协议网络通信程序设计所需的抽象接口类CClientV4。
支持IPv4协议通信功能的接口类CClientV4继承自抽象接口父类CClient,接口类CClientV4所提供的接口方法与抽象接口父类CClient所规定的接口方法完全相同,但其具体底层实现完全依照IPv4协议下的Socket函数接口给出。
下面以C++语言为例,对设计和实现支持IPv4协议通信功能的接口类CClientV4进行详细说明。class CClientV4:public CClient{Private:
SOCKET mySocket;//发送和接收数据的套接字unsigned int port; //存储当前连接端口号SMsgHead*MsgHead; //存储消息头unsigned int CurrSeq; //存储当前序列号,用于消息匹配bool HasInit; //检查Winsock是否已经初始化timeval*timeout;//检查套接字状态的超时时间CList*Result BuftList; //存放接收数据的链表SData*MakePackage(char*data,int len);//为消息体加消息头的组包char*unpack(SData*data);//将消息体和消息头分开的拆包………Public:
CClient();
~CClient();
virtual bool IsInit();//检查winsock是否初始化了virtual void Init(); //初始化winsockvirtual char*ConnectServ(char*IP,int_port);//连接服务器virtual bool DisConnectServ(int port); //断开连接,并释放socket所占资源virtual void SendData(char*data,int len);//发送数据virtual char*RcvData(); //接收数据
virtual void SetTimeout(intsec,int usec); //设置连接超时时间virtual void ReleaseBuf(char*buff);//释放所有的缓冲区…………};
其中,SMsgHead为应用层开发者所制订的通信协议中规定的消息头结构,SData为添加了消息头的通信数据包结构。接口ConnectServ()提供连接远程IPv4服务器的功能,其内部实现流程为首先需要使用Init()初始化winsock,然后使用socket()函数创建socket,接下来使用ioctlsocket()设置非阻塞的连接方式,再使用bind()将该socket绑定到本地地址,使用connect()向远程IPv4服务器发起连接请求,设置超时,然后调用select()检查是否可读,成功后调用ioctlsocket()将该socket设置为阻塞模式。
对于网络通信模块用于完成网络通信中客户端功能部分,步骤102中所述设计和实现支持IPv6协议通信功能的接口类包括利用面向对象的设计思想,根据抽象接口父类CClient的规范至少设计IPv6下的发送和接收数据套接字的属性SOCKET mySocket、存储当前连接端口号的属性unsigned int port、存储消息头的属性SMsgHeadMsgHead、存储当前序列号的属性unsigned int CurrSeq、检查Winsock是否已经初始化的接口bool HasInit、检查套接字状态超时时间的接口timevaltimeout、存放接收数据链表的接口CList Result_BuffList、为消息体加消息头的组包接口SData MakePackage和将消息体和消息头分开的拆包接口char unPack,实现支持IPv6协议网络通信程序设计所需的抽象接口类CClientV6。
支持IPv6协议通信功能的接口类CClientV6继承自抽象接口父类CClient,接口类CClientV6所提供的接口方法与抽象接口父类CClient所规定的接口方法完全相同。所不同的是,其具体底层实现完全依照IPv6下的Socket函数接口给出。
下面以C++语言为例,对设计和实现支持IPv6协议通信功能的接口类CClientV6进行详细说明。
SOCKET mySocket;//发送和接收数据的套接字unsigned int port; //存储当前连接端口号SMsgHead*MsgHead; //存储消息头unsigned int CurrSeq; //存储当前序列号,用于消息匹配bool HasInit; //检查Winsock是否已经初始化timeval*timeout;//检查套接字状态的超时时间CList*Result BuffList; //存放接收数据的链表SData*MakePackage(char*data,int len);//为消息体加消息头的组包char*unPack(SData*data); //将消息体和消息头分开的拆包…………Public:
CClientV6();
~CClientV6();
virtual bool IsInit();//检查winsock是否初始化了virtual void Init(); //初始化winsockvirtual char*ConnectServ(char*IP,int_port);//连接服务器virtual bool DisConnectServ(int port);//断开连接,并释放socket所占资源virtual void SendData(char*data,int len);//发送数据virtual char*RcvData(); //接收数据virtual void SetTimeout(int sec,int usec); //设置连接超时时间virtual void ReleaseBuf(char*buff); //释放所有的缓冲区…………};
其中,SMsgHead为应用层开发者所制订的通信协议中规定的消息头结构,SData为添加了消息头的通信数据包结构,与上述设计和实现接口类CClient V4时的相同。接口ConnectServ()提供连接远程IPv6服务器的功能,其内部实现流程与上述设计和实现接口类CClient V4时有较大差异首先需要使用Init()初始化winsock,然后填写模板,准备创建用于连接服务器的socket,再调用getaddrinfo()解析服务器地址,然后使用socket()函数创建socket,接下来使用ioctlsocket()设置非阻塞的连接方式,再使用connect()向远程IPv6服务器发起连接请求,设置超时,然后调用select()检查是否可读,调用freeaddrinfo()释放解析地址时返回的地址列表,成功后调用ioctlsocket()将该socket设置为阻塞模式。
对于网络通信模块用于完成网络通信中服务器端功能部分,所述步骤101包括利用面向对象的设计思想,根据上层用户的实际需求为抽象接口父类至少设计如下公共Public成员用于启动线程的接口Start、用于暂停线程的接口Stop,用于终止线程并释放资源的接口Release、用于获取接收数据包链表中第一个数据包的接口GetFirstRcvData、用于删除接收数据包链表中第一个数据包的接口DelFirstRcvData、用于设置超时时间的接口SetTimeout和用于设置侦听最大连接数的接口SetMaxConn,实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类CSrvThread。
所述抽象接口父类CSrvThread的Public成员至少包括以下接口用于启动线程的接口Start、用于暂停线程的接口Stop,用于终止线程并释放资源的接口Release、用于获取接收数据包链表中第一个数据包的接口GetFirstRcvData、用于删除接收数据包链表中第一个数据包的接口DelFirstRcvData、用于设置超时时间的接口SetTimeout和用于设置侦听最大连接数的接口SetMaxConn。
下面以C++语言为例,对设计和实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类CSrvThread进行详细说明。class CSrvThread:public CThread{Private:
…………Protected:
void_Execute();
…………Public:
CSrvThread(void*handle,bool CreateSuspended=true);
virtual void Start();//启动线程virtual void Stop(); //暂停线程virtual void Release(); //停止线程,释放资源virtual char*GetFirstRcvData(); //获取数据包链表中的第一个包virtual void DelFirstRcvData(); //删除数据包链表中的第一个包virtual void SetTimeout(long sec,long u_sec);//设置超时时间virtual void SetMaxConn(int maxconn); //设置侦听的最大连接数…………};
其中,多数通信操作接口被设计和实现为virtual类型,以支持和实现在具体应用中的动态绑定。同时,上层应用程序开发者还可以根据本发明的基本思想,针对自己的应用程序通信协议,在本套基本接口的基础上轻松地进行扩展。
对于网络通信模块用于完成网络通信中服务器端功能部分,步骤102中所述设计和实现支持IPv4协议通信功能的接口类包括利用面向对象的设计思想,根据抽象接口父类CSrvThread的规范至少设计IPv4下的侦听套接字的属性SOCKET LstSocket、默认值为系统所允许最大连接数的属性int MaxConn、存储本地地址的属性sockaddrLocalAddr、存储本地端口的属性unsigned int LocalPort、用于表明已开启接收数据线程链表的属性CList ThreadList、存放接收数据包链表的属性CList RcvData_List、初始化winsock并绑定本地地址开始监听的接口boolStartUp和终止ThreadList中线程并释放空间的接口void CleanUp,实现支持IPv4协议网络通信程序设计所需的抽象接口类CSrvLstV4Thread。
支持IPv4协议通信功能的接口类CSrvLstV4Thread继承自抽象接口父类CSrvLstThread,接口类CSrvLstV4Thread所提供的接口方法与抽象接口父类CSrvLstThread所规定的接口方法完全相同,但其具体底层实现完全依照IPv4协议下的Socket函数接口给出。
下面以C++语言为例,对设计和实现支持IPv4协议通信功能的接口类CSrvLstV4Thread进行详细说明。class CSrvLstV4Thread:public CSrvThread{Private:
SOCKET LstSocket;//侦听套接字int MaxConn; //默认值为系统所允许的最大连接数sockaddr*LocalAddr; //存储本地地址unsigned int LocalPort; //存储本地端口CList*ThreadList;//用于表明已开启接收数据的线程链表CList*RcvData_List; //存放接收的数据包链表bool StartUp(); //初始化winsock并绑定本地地址开始监听void CleanUp(); //终止ThreadList中线程并释放空间…………Protected:
void_Execute();
…………Public:
CSrvThread(void*handle,bool CreateSuspended=true);
virtual void Start();//启动线程virtual void Stop(); //暂停线程virtual void Release(); //停止线程,释放资源virtual char*GetFirstRcvData(); //获取数据包链表中的第一个包virtual void DelFirstRcvData(); //删除数据包链表中的第一个包virtual void SetTimeout(long sec,long u_sec);//设置超时时间virtual void SetMaxConn(int maxconn);//设置侦听的最大连接数…………};
其中,CList为链表类型,接口StartUp()主要实现如下功能初始化winsock、绑定本地地址并开始侦听。其实现流程为首先调用WSAStartup()函数初始化winsock,创建socket准备进行侦听,依次调用gethostname()和gethostbyname()函数,再调用bind()将该socket绑定到本地指定端口,最后调用listen()开始侦听。
与此侦听线程类关系非常密切的是接收线程类,利用C++语言,接收线程接口类的设计原型描述如下class CSrvV4RcvThread:public CThread{Private:
SOCKET RcvSocket;//接收数据套接字sockaddr*RemoteAddr; //远程地址timeval*timeout; //超时时间CSrvLstV4Thread*Srv; //侦听线程char*RcvData(); //接收数据void SendData(char*data,int len);//发送数据…………Protected:
void_Execute();
…………Public:
CSrvV4RcvThread(CSrvLstV4Thread*SrvLst,bool Suspended=true);
………};
其中,SendData()用来接收数据,其实现流程主要包括调用select()和send()函数。RcvData()亦类似实现。
对于网络通信模块用于完成网络通信中客户端功能部分,步骤102中所述设计和实现支持IPv6协议通信功能的接口类包括利用面向对象的设计思想,根据抽象接口父类CSrvThread的规范至少设计IPv6下的侦听套接字的属性SOCKET LstSocket、默认值为系统所允许最大连接数的属性int MaxConn、存储本地端口的属性unsigned intLocalPort、用于表明已开启接收数据线程链表的属性CList ThreadList、存放接收数据包链表的属性CList RcvData_List、初始化winsock并绑定本地地址开始监听的接口bool StartUp和终止ThreadList中线程并释放空间的接口void CleanUp,实现支持IPv4协议网络通信程序设计所需的抽象接口类CSrvLstV6Thread。
支持IPv6协议通信功能的接口类CSrvLstV6Thread继承自抽象接口父类CSrvLstThread,接口类CSrvLstV6Thread所提供的接口方法与抽象接口父类CSrvLstV6Thread所规定的接口方法完全相同。所不同的是,其具体底层实现完全依照IPv6下的Socket函数接口给出。
下面以C++语言为例,对设计和实现支持IPv6协议通信功能的接口类CSrvLstV6Thread进行详细说明。class CSrvLstV6Thread:public CSrvThread{Private:
SOCKET LstSocket;//侦听套接字int MaxConn; //默认值为系统所允许的最大连接数unsigned int LocalPort; //存储本地端口CList*ThreadList;//用于表明已开启接收数据的线程链表CList*RcvData_List; //存放接收的数据包链表bool StartUp(); //初始化winsock并绑定本地地址开始监听void CleanUp(); //终止ThreadList中线程并释放空间………Protected:
void_Execute();
…………Public:
CSrvThread(void*handle,bool CreateSuspended=true);
virtual void Start(); //启动线程virtual void Stop(); //暂停线程virtual void Release(); //停止线程,释放资源virtual char*GetFirstRcvData(); //获取数据包链表中的第一个包virtual void DelFirstRcvData(); //删除数据包链表中的第一个包virtual void SetTimeout(long sec,long u_sec);//设置超时时间virtual void SetMaxConn(int maxconn);//设置侦听的最大连接数…………};
其中,StartUp()实现如下功能初始化winsock、绑定本地地址并开始侦听。其实现流程为首先调用WSAStartup()函数初始化winsock,然后调用getaddrinfo()解析服务器地址,接着创建socket准备进行侦听,再调用bind()将该socket绑定到本地指定端口,最后调用listen()开始侦听并调用freeaddrinfo()释放解析服务器地址时获得的地址列表。
同样,利用C++语言,将与此侦听线程类相应的接收线程接口类的设计原型描述如下class CSrvV6RcvThread:public CThread{Private:
SOCKET RcvSocket; //接收数据套接字SOCKADDR_STORAGE*RemoteAddr;//远程地址timeval*timeout; //超时时间CSrvLstV6Thread*Srv; //侦听线程char*RcvData();//接收数据void SendData(char*data,int len);//发送数据…………Protected:
void_Execute();
…………Public:
CSrvV6RcvThread(CSrvLstV6Thread*SrvLst,bool Suspended=true);
…………};
其中,SendData()用来接收数据,其实现流程主要包括调用select()和send()函数。RcvData()亦类似实现。
由上可见,不管网络通信功能部分是将被用作客户端还是服务器端程序,该部分都可以采用此种设计方法。
另外,步骤102中所述设计和实现支持IPv4和IPv6协议通信功能的接口类,根据IPv4和IPv6底层Socket函数接口和使用方法的不同,分别继承步骤101中所设计和实现的抽象接口父类且沿照统一的接口格式进行。
为了更加清楚的说明采用本发明技术方案能够满足在开发支持IPv4和IPv6双协议栈网络应用程序或系统过程中,对统一底层通信功能接口的迫切需求,以下结合本发明具体的应用对本发明提供的技术方案进一步详细说明。
假设需要同时与远程服务器进行IPv4和IPv6的通信,则可以非常容易地应用本发明给出的接口类CClient、CClientV4、CClientV6,用C++语言描述一个在Windows平台下的应用实例如下void main(){//创建客户端网络组件并初始化CClient*clientCom1=new CClientV4();//创建IPv4客户端网络组件if(NULL==clientCom1){//出错处理,给出提示信息并返回}CClient*clientCom2=new CClientV6();//创建IPv6客户端网络组件
if(NULL==clientCom2){//出错处理,给出提示信息并返回}char*echo=NULL;
clientCom1->Init();
clientCom2->Init();
∥连接远程IPv4服务器echo=clientCom1->ConnectServ(“202.197.4.33”,5000)).
if(echo==NULL){//出错处理,给出提示信息并返回}//连接远程IPv6服务器echo=clientCom2->ConnectServ(“2001:250:f007:c:213:72ff:feb6:b179”,5000)).
if(echo==NULL){//出错处理,给出提示信息并返回}//开始与服务器进行数据通信clientCom1->.SendData(“Hello!”,6);
clientCom2->.SendData(“World!”,6);
……//断开连接clientCom1->.DisConnPro();
clientCom2->.DisConnPro();
……}同样,本发明给出的接口类CSrvThread、CSrvLstV4Thread、CSrvLstV6Thread的使用方法也类似于上面这个例子,在此就不再举例说明。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
另外,需要说明的是,在本发明说明书涉及的各段程序语言中,都是基于Windows平台实现的,如果基于Linux平台实现本发明提供的技术方案,只需将上述各段程序语言中的初始化winsock的语句去掉,即可直接应用到Linux平台上。
权利要求
1.一种支持IPv4和IPv6双协议栈网络通信模块的实现方法,其特征在于,该方法包括A、设计和实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类;B、在所实现抽象接口父类的基础上,分别设计和实现支持IPv4和IPv6协议通信功能的接口类。
2.根据权利要求1所述的支持IPv4和IPv6双协议栈网络通信模块的实现方法,其特征在于,所述网络通信模块用于完成网络通信中客户端功能部分,且网络通信模块在Linux平台下设计和实现,所述步骤A包括利用面向对象的设计思想,根据上层用户的实际需求为抽象接口父类至少设计如下公共Public成员连接远程服务器的接口ConnectServ、断开与该远程服务器之间连接的接口DisConnectServ、发送数据的接口SendData、接收数据的接口RcvData、设置建立连接超时时间的接口SetTimeout和释放所有缓冲区的接口ReleaseBuf,实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类CClient。
3.根据权利要求2所述的支持IPv4和IPv6双协议栈网络通信模块的实现方法,其特征在于,所述抽象接口父类CClient的Public成员至少包括以下接口连接远程服务器的接口ConnectServ、断开与该远程服务器之间连接的接口DisConnectServ、发送数据的接口SendData、接收数据的接口RcvData、设置建立连接超时时间的接口SetTimeout和释放所有缓冲区的接口ReleaseBuf。
4.根据权利要求1所述的支持IPv4和IPv6双协议栈网络通信模块的实现方法,其特征在于,所述网络通信模块用于完成网络通信中客户端功能部分,且网络通信模块在windows平台下设计和实现,所述步骤A包括利用面向对象的设计思想,根据上层用户的实际需求为抽象接口父类至少设计如下Public成员检查套接字winsock是否已经初始化的接口IsInit、初始化winsock的接口Init、连接远程服务器的接口ConnectServ、断开与该远程服务器之间连接的接口DisConnectServ、发送数据的接口SendData、接收数据的接口RcvData、设置建立连接超时时间的接口SetTimeout和释放所有缓冲区的接口ReleaseBuf,实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类CClient。
5.根据权利要求4所述的支持IPv4和IPv6双协议栈网络通信模块的实现方法,其特征在于,所述抽象接口父类CClient的Public成员至少包括以下接口检查套接字winsock是否已经初始化的接口IsInit、初始化winsock的接口Init、连接远程服务器的接口ConnectServ、断开与该远程服务器之间连接的接口DisConnectServ、发送数据的接口SendData、接收数据的接口RcvData、设置建立连接超时时间的接口SetTimeout和释放所有缓冲区的接口ReleaseBuf。
6.根据权利要求2至5中任一项所述支持IPv4和IPv6双协议栈网络通信模块的实现方法,其特征在于,步骤B中所述设计和实现支持IPv4协议通信功能的接口类包括利用面向对象的设计思想,根据抽象接口父类CClient的规范至少设计IPv4下的发送和接收数据套接字的属性SOCKET mySocket、存储当前连接端口号的属性unsigned int port、存储消息头的属性SMsgHeadMsgHead、存储当前序列号的属性unsigned int CurrSeq、检查Winsock是否已经初始化的接口bool HasInit、检查套接字状态超时时间的接口timevaltimeout、存放接收数据链表的接口CList Result_BuffList、为消息体加消息头的组包接口SData MakePackage和将消息体和消息头分开的拆包接口char unPack,实现支持IPv4协议网络通信程序设计所需的抽象接口类CClientV4。
7.根据权利要求2至5中任一项所述支持IPv4和IPv6双协议栈网络通信模块的实现方法,其特征在于,步骤B中所述设计和实现支持IPv6协议通信功能的接口类包括利用面向对象的设计思想,根据抽象接口父类CClient的规范至少设计IPv6下的发送和接收数据套接字的属性SOCKET mySocket、存储当前连接端口号的属性unsigned int port、存储消息头的属性SMsgHeadMsgHead、存储当前序列号的属性unsigned int CurrSeq、检查Winsock是否已经初始化的接口bool HasInit、检查套接字状态超时时间的接口timevaltimeout、存放接收数据链表的接口CList Result_BuffList、为消息体加消息头的组包接口SData MakePackage和将消息体和消息头分开的拆包接口char unPack,实现支持IPv6协议网络通信程序设计所需的抽象接口类CClientV6。
8.根据权利要求1所述的支持IPv4和IPv6双协议栈网络通信模块的实现方法,其特征在于,所述网络通信模块用于完成网络通信中服务器端功能部分,所述步骤A包括利用面向对象的设计思想,根据上层用户的实际需求为抽象接口父类至少设计如下公共Public成员用于启动线程的接口Start、用于暂停线程的接口Stop,用于终止线程并释放资源的接口Release、用于获取接收数据包链表中第一个数据包的接口GetFirstRcvData、用于删除接收数据包链表中第一个数据包的接口DelFirstRcvData、用于设置超时时间的接口SetTimeout和用于设置侦听最大连接数的接口SetMaxConn,实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类CSrvThread。
9.根据权利要求8所述的支持IPv4和IPv6双协议栈网络通信模块的实现方法,其特征在于,所述抽象接口父类CSrvThread的Public成员至少包括以下接口用于启动线程的接口Start、用于暂停线程的接口Stop,用于终止线程并释放资源的接口Release、用于获取接收数据包链表中第一个数据包的接口GetFirstRcvData、用于删除接收数据包链表中第一个数据包的接口DelFirstRcvData、用于设置超时时间的接口SetTimeout和用于设置侦听最大连接数的接口SetMaxConn。
10.根据权利要求8或9所述的支持IPv4和IPv6双协议栈网络通信模块的实现方法,其特征在于,步骤B中所述设计和实现支持IPv4协议通信功能的接口类包括利用面向对象的设计思想,根据抽象接口父类CSrvThread的规范至少设计IPv4下的侦听套接字的属性SOCKET LstSocket、默认值为系统所允许最大连接数的属性int MaxConn、存储本地地址的属性sockaddrLocalAddr、存储本地端口的属性unsigned int LocalPort、用于表明已开启接收数据线程链表的属性CList ThreadList、存放接收数据包链表的属性CList RcvData_List、初始化winsock并绑定本地地址开始监听的接口boolStartUp和终止ThreadList中线程并释放空间的接口void CleanUp,实现支持IPv4协议网络通信程序设计所需的抽象接口类CSrvLstV4Thread。
11.根据权利要求8或9所述的支持IPv4和IPv6双协议栈网络通信模块的实现方法,其特征在于,步骤B中所述设计和实现支持IPv6协议通信功能的接口类包括利用面向对象的设计思想,根据抽象接口父类CSrvThread的规范至少设计IPv6下的侦听套接字的属性SOCKET LstSocket、默认值为系统所允许最大连接数的属性int MaxConn、存储本地端口的属性unsigned intLocalPort、用于表明已开启接收数据线程链表的属性CList ThreadList、存放接收数据包链表的属性CList RcvData_List、初始化winsock并绑定本地地址开始监听的接口bool StartUp和终止ThreadList中线程并释放空间的接口void CleanUp,实现支持IPv4协议网络通信程序设计所需的抽象接口类CSrvLstV6Thread。
12.根据权利要求1所述的支持IPv4和IPv6双协议栈网络通信模块的实现方法,其特征在于,步骤B中所述设计和实现支持IPv4和IPv6协议通信功能的接口类,根据IPv4和IPv6底层Socket函数接口和使用方法的不同,分别继承步骤A中所设计和实现的抽象接口父类,且沿照统一的接口格式进行。
全文摘要
本发明公开了一种支持IPv4和IPv6双协议栈网络通信模块的实现方法,该方法包括A.设计和实现支持IPv4和IPv6协议网络通信程序设计所需的抽象接口父类;B.在所实现抽象接口父类的基础上,分别设计和实现支持IPv4和IPv6协议通信功能的接口类。利用本发明,满足了在开发支持IPv4和IPv6双协议栈网络应用程序或系统过程中,对统一底层通信功能接口的迫切需求,很好的屏蔽了底层利用IPv4协议与IPv6协议通信的差异,使上层开发人员能直接使用该套统一的接口进行开发,而无需关心和处理IPv4协议与IPv6协议通信的差别。
文档编号H04L12/66GK1870654SQ20061008934
公开日2006年11月29日 申请日期2006年6月21日 优先权日2006年6月21日
发明者彭达, 张广兴, 李振宇, 杨建华, 谢高岗 申请人:中国科学院计算技术研究所