基于Windows套接字编程的网络编码仿真实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于Windows套接字编程的网络编码仿真实现摘要:针对网络编码数据传输技术,采用windows套接字编程工具,提出了一种仿真实现方法。在局域网内选取若干个终端模拟网络节点,逻辑上构成一个单源组播网络,各终端上采用socket套接字编程方法,按照网络编码数据传输策略进行收发数据。给出的例子是典型的蝴蝶网络,但容易扩充到一般的单源组播网络。与已有的网络编码仿真器相比,提出的方法具有简便、易于掌握的特点。关键词:线性网络编码;蝴蝶网络;套接字编程;仿真实现simulationimplementationofnetworkcodingbasedonwindowssocketprogrammingshenming,pubao-xing*,tangbin(departmentofinformationengineering,shaoyangcollege,shaoyang422001,hunan,china)【abstract】byuseofwindowssocketprogramming,amethodofsimulationimplementationofnetworkcodingisproposed.inalocalareanetwork,someterminalsareselectedtosimulatethenetworknodeslogicallytoformasinglesourcemulticastnetwork.withadoptingsocketprogramming,theterminalssendorreceiverdataaccordingtothedatatransmissionstrategyofnetworkcoding.theillustratedexampleisatypicalbutterflynetwork,butcaneasilyextendtogeneralsinglesourcemulticastnetwork.comparingwiththeexistingnetworkcodingsimulator,theproposedmethodissimple,convenientandeasilytobemastered.【keywords】linearnetworkcoding;butterflynetwork;socketprogramming;simulationimplementation0引言网络仿真在网络技术的教学和科研中具有重要意义,它为理解网络理论、研究和应用网络技术提供了方便的分析工具,同时也是一种有效研究方法。网络编码[1]是一种新型的数据传输技术,它是传统路由传输技术的扩展:节点不仅进行信息转发与复制,还可以进行信息编码。因网络编码具有能提升网络的吞吐量,增加网络的安全性和鲁棒性等优点[2,3],从而得到了深入广泛的研究。对于网络编码研究过程中的实验环节和仿真实现,目前通常采用自编模拟程序的方式[4,5],但该方式不直观,且不利于对实验结果的分析比较,同时,对某些应用性能存在争议[6];还有一些学者选择ns这一网络仿真平台[7],但ns本身只支持节点的路由传输,而不支持节点的编码传输,从而必须对其进行扩展,由于ns的复杂性,扩展具有一定的难度;此外,还可以采用硬件的方法构造实验平台实现[8,9],但必须采用特殊的硬件,实现起来较麻烦。本文提出了一种简便的网络编码仿真实现方法,它不需要特定的软、硬件支持,同时又不同于软件仿真,具有一定的直观性。在局域网内选取若干终端来模拟网络节点,构成逻辑上的单源组播网络,根据网络编码数据传输策略,各节点采用windows套接字编程[10]方法实现数据的接收与发送,宿点对接收到的数据进行解码而恢复出源点播出的信息。实验表明,提出的方法是有效的,且该方法具有软硬件要求低、操作方便的特点,并易于掌握。尽管本文给出的是一个较为简单的网络拓扑结构:蝴蝶网络[11],但提出的方法适用于一般的单源组播网络。提出的方法为网络编码数据传输技术提供了有效的仿真实现方法,对网络编码的科研和教学具有重要的意义。1网络编码数据传输技术网络编码是路由技术的扩展,除继承了路由传输技术的信息复制与转发功能外,还允许网络节点对信息进行编码后再传输,信息编码建立在有限域上,即编码是各信息在有限域上的线性组合(线性网络编码),宿点从所有的输入信道收到信息后,必须通过联立方程,求解线性方程组才能恢复出源点的信息。图1是典型的蝴蝶网络,在不少文献中用于描述网络编码的原理,它是一个有向无环单源组播网络,其中节点s是源点,t1和t2是宿点,节点2、3、4、5为中间节点。设每条链路的信道容量均为1,即每条链路在单位时间内最多只能传输一个字符,而源点s欲通过网络组播信息至两个宿点t1、t2。若采用路由传输技术,因为节点4至节点5的信道是数据传输的瓶颈,则在一个时间单元内,源点最多只能组播一个字符至两个宿点,若采用网络编码技术,则可以组播两个字符。在同一时间单元内,设源点s要组播两个字符a和b至宿点,则其数据传输过程如下:①s把字符a传输至输出信道,把字符b传输至输出信道。②节点2从信道上接收到字符a后,把它分别转发至输出信道和;节点3从信道上接收到字符b后,把它转发至输出信道和。③节点4分别从信道和上接收字符a和字符b后,对接收到的信息进行编码,即作异或运算:c=a⊕b,然后把编码后的信息c分别传输至输出信道。④节点5从信道收到信息c后,把它分别传输至信道和。⑤宿点t1分别从信道和上收到信息a和c后,作异或运算a⊕c,得到b,从而宿点t1接收到了源点播出的信息a和b;同理,宿点t2分别从信道和3windows套接字编程技术windows的api提供了一系列的套接字编程函数,用于网络通信程序设计[10]。它的函数声明位于头文件winsock2.h中,其函数体包含在“w_32.lib”中,编程时以动态链接库的形式实现,从而程序中必须把相应的头文件和动态链接库加入。程序开始执行时,必须调用wsastartup函数对动态链接库的调用进行初始化,当网络编程结束,必须调用wsacleanup函数来解除动态链接库的加载并释放一定的资源。windowsapi提供了套接字编程方法来实现数据的发送与接收,有三种套接字:流式套接字,数据报套接字和原始套接字。其中流式套接字可以实现tcp协议,数据报套接字可以实现udp协议,原始套接字可以实现ip协议。套接字是数据发送与接收的窗口,并与一个三元组相联系,这个三元组包括“网络协议、ip地址和端口号”,当套接字与这个三元组相联系时,则可以通过该套接字发送或接收数据,当发送数据时,数据从该ip地址对应的网卡中以相应的端口号把数据发送至网络;当接收数据时,凡从网络上发往本机上相应端口号的数据,均可以从该套接字中读出。本文采用数据报套接字,其工作方式为阻塞模式。接收数据与发送数据的编程方法如下所述。3.1数据接收方的工作过程创建数据报套接字:采用socket函数创建数据报套接字。socketsocksrv=socket(af_inet,sock_dgram,0)②定义一个地址变量,用于保存本机ip地址和相应的端口号,并把该地址变量与创建的套接字绑定。sockaddr_inaddrsrv;addrsrv.sin_addr.s_un.s_addr=htonl(inaddr_any);//本机ip地址addrsrv.sin_family=af_inet;//tcp/ip协议addrsrv.sin_port=htons(20012);//选定一个端口号bind(socksrv,(sockaddr*)&addrsrv,len);//把套接字与三元组地址绑定。③从套接字上接收数据:调用recvfrom函数,从套接字中接收数据。intdatalen=recvfrom(socksrv,rcvbuff,bufflen,ddr*)&addrsrv,&len)。其中rcvbuff是接收数据缓冲区的首地址,bufflen是一个整数,为接收数据缓冲区的长度,len是一个整型变量,其值等于sizeof(addrsrv)。当函数调用结束,datalen中保存了实际接收的字节数。④关闭套接字:当数据接收完毕,则需要调用closesocket(socksrv)函数关闭套接字。3.2数据发送方的工作过程①创建数据报套接字②把接收方的ip地址和相应的端口号保存在一个地址变量中;③调用sendfrom函数,通过套接字和地址变量发送数据;sendto(sockclient,sendbuff,len1,0,(sockaddr*)&addrsrv,len);其中sockclient是数据报套接字,sendbuff是发送数据缓冲区的起始地址,len1是要发送数据的字节数,addrsrv是保存了数据接收方的三元组的地址变量。④关闭套接字。在发送和接收数据时,接收方的ip地址与端口号必须与发送方指定目标地址的三元组一致。4网络编码数据传输技术的仿真针对图1的蝴蝶网络,在局域网络选定6个终端,不妨设这7个终端在同一个c类地址(172.16.101)的网段内,其ip地址与端口号的设置如图2所示。这7个终端的主机号分配如下:s:11,2:12,3:13,4:14,5:15,t1:16,t2:17,从而s的ip地址为172.16.101.11,其余节点的ip地址可以类推。假设需要从节点s发送数据至宿点t1和t2,发送的数据是一个字符串“abcdefghijklmnopqrstuvwxyz”,也可以是内容任意的字符串,长度不加限制,若字符串的长度太长,可以采用多次发送。在采用套接字编程时,还必须为套接字设置端口号,各数据传输链路的端口号如下::20012,:20013,:20026,:20024,:20024,:20037,:20045,:20056,:20057。图2网络节点的ip地址和端口号分配4.1源点s定义存贮字符串的缓冲区senbuff,并把要发送的字符串存入该缓冲区中。把该字符串分成相等的两部分,每一部分的长度各为strlen(sendbuff)/2,然后把每一部分作为udp数据通过图2中指定的端口号发送至指定的节点,其程序段如下:socketsockclient=socket(af_inet,sock_dgram,0);//创建数据报套接字charsendbuff[]=“abcdefghijklmnopqrstuvwxyz”;//发送缓冲区sockaddr_inaddrsrv1,addrsrv2;addrsrv1.sin_addr.s_un.s_addr=inet_addr(“172.16.101.12”);//节点2的ip地址addrsrv1.sin_family=af_inet;addrsrv1.sin_port=htons(20012);//数据传输信道的端口号addrsrv2.sin_family=af_inet;addrsrv2.sin_addr.s_un.s_addr=inet_addr(“172.16.101.13”);//节点3的ip地址addrsrv2.sin_port=htons(20013);//数据传输信道的端口号intlen=sizeof(sockaddr),len1=strlen(sendbuff);sendto(sockclient,sendbuff,len1/2,0,(sockaddr*)&addrsrv1,len);//把字符串的前一半发送至节点2sendto(sockclient,sendbuff+len1/2,len1/2,0,(sockaddr*)&addrsrv2,len);//把字符串的后一半发送至节点3closesocket(sockclient);4.2节点2节点2从源点接收数据,然后分别转发至下游节点,因此需要定义两个套接字,一个套接字用于接收数据,另一个套接字用于发送数据,相应的收发数据的程序段如下:socketsocksrv=socket(af_in

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功