文件传输范文篇1

关键词:文件传输服务器;系统设计;模型设计;模块化

1引言

现在网络中所传输的数据无非就是小的数据包或是大的媒体或文件流数据。通过研究一个具有实际功能的文件传输服务器,对于理解服务器通信软件的设计具有一定意义。因为文件传输服务器既可以传输小的信息数据,也可以传输大的文件数据流。本文主要探讨了文件传输服务器的设计关键技术。

2系统设计要求和设计思路

文件传输范文

关键词:VxWorks;FTP;分包传输;在线更新

中图分类号:TN919?34;TP311.1文献标识码:A文章编号:1004?373X(2013)24?0050?05

ResearchandimplementationoffiletransfermethodunderVxWork

WANGHao1,JIALiang1,LIYong?tian2

(1.ElectronicandInformationEngineeringInstitute,ShenyangAerospaceUniversity,Shenyang110136,China;

2.BeijingFangtianChangjiuScienceandTechnologyLtd,beijing100084,China)

Abstract:Inaprojectdevelopmentprocess,inordertomeettheneedsofonlineFlashupdateofDSPapplicationprogramindataacquisitionsystem,firstofall,theapplicationprogramisdownloadedtothesystemcontrollermemorybymeansoftheTornadodevelopmentenvironmentbuilt?inFTPserver,thenencapsulatedintopacketstotransmit,andfinallytheapplicationprogramupdateisrealized.Theprogramsolvestheproblemthatwhendatadumpspaceislessthanthesizeofdatatransferfile,andthesubpackagetransmissioninseveraltimesisrequired.TheentiresoftwaredevelopmentprocessisperformedintheTornadodevelopmentenvironment,whichisabletocompletethesubpackageerror?freetransmissionofapplicationfiles.ThepracticalapplicationshowsthatthesoftwareprogramdesignedaccordingtotheschemecanachieveagoodFlashonlineupdate,hasthecharacteristicsofsubpackagetransmissionanddataaccuracy,andcanmeetthedesignrequirements.

Keywords:VxWorks;FTP;subpackagetransmission;onlineupdate

随着计算机技术、半导体技术以及软件技术的飞速发展,嵌入式微处理器的性能也得到不断提高,嵌入式操作系统的种类更是层出不穷,从而使得嵌入式系统在越来越多的领域得到更加广泛的应用。其中,美国WindRiverSystem公司于1983年设计开发的一种嵌入式实时操作系统(RTOS)VxWorks凭借其可移植性强等优点得到了广泛的应用[1]。VxWorks提供的系统接口要比其他操作系统丰富,因此选择它来作为嵌入式采集系统的软件控制平台,可以大大提高开发的效率[2]。本文应用Motorola公司的MCP?750PowerPC嵌入式CPCI单板机作为系统控制器及北京方天长久科技有限公司的FTC?6010作为数据采集板组成数据采集系统。在开发过程中,考虑到了数据采集板有可能工作在不方便拆卸的场合,无法使用下载器对数据采集板上的DSP进行应用程序的更新,本文的研究重点就是实现对数据采集板上的DSP应用程序进行在线FLASH更新,从而摆脱下载器的束缚。基于以上考虑,规定了一份适合于本数据采集系统需要的分包文件传输协议,并在此基础上用C语言封装了一个基于VxWorks下的功能模块,此功能模块的设计成功的实现了DSP程序在线FLASH更新,满足了开发的需要。

1数据采集系统分析介绍

1.1系统总体结构及软硬件开发环境

数据采集系统基于CPCI总线实现,系统总体结构及软硬件开发环境如图1所示,上位机TornadoIDE(VxWorks集成开发环境)通过以太网络和MCP?750PowerPC嵌入式单板机相连,MCP?750作为CPCI总线控制器通过CPCI总线控制数据采集板(FTC?6010),同时通过串口输出信息到上位机,便于操作。

图1系统总体结构及软硬件开发环境

1.2DSP应用程序在线FLASH更新时数据流向

图2简要给出了DSP应用程序在线FLASH更新时数据的流向,上位机使用FTP通过网络将应用程序的二进制文件下载到系统控制器的内存中,再从系统控制器的内存中通过CPCI总线将文件传送至数据采集板上DSP外接的FLASH中,最后实现FLASH的更新。在传送过程中,由于系统控制器与数据采集板上的DSP需要通过DPSRAM进行交互,而DPSRAM的存储空间有限,此时就需要将应用程序文件分包进行传输,传输协议的制定就显得至关重要了,需要保证数据传输正确,传输过程不丢包。

图2DSP应用程序在线FLASH更新时数据流向

2FTP文件传输

2.1FTP介绍

文件传输协议(FileTransferProtocol,FTP)是TCP/IP的一种具体应用,工作在OSI模型的第7层,TCP模型的第4层,即应用层。FTP要求客户向服务器提供用户注册名和口令,服务器拒绝非法用户的访问。但是链接一旦建立成功,一个或多个文本或图像二进制文件都能被传送,FTP不必担心可靠性和连接的管理,因为FTP依靠TCP正确执行这些功能[3]。Tornado开发环境自带FTP服务器,常见用于系统成功引导后,下载VxWorks的运行时映象,需正确配置用户名,密码和路径[4]。

2.2VxWorks下FTP程序的编写

可以直接使用VxWorks提供的几个API函数进行FTP程序的编写,实现从上位机将应用程序文件下载到系统控制器的内存中的目的,这里主要介绍三个:ftpXfer、ftpReplyGet和ftpCommand,几个函数的原型和主要用法如下[5]:

ftpXfer的作用是初始化通过FTP传输的文件。

STATUSftpXfer

char*host,

/*ftp服务器的IP地址,点分十进制,格式类似于"10.0.0.1"*/

char*user,/*访问ftp服务器的用户名*/

char*passwd,/*访问ftp服务器的密码*/

char*acct,/*一般不用,直接填写为空字符串就可以了*/

char*cmd,/*发送给FTP服务器的命令,例如读取命令为"RETR"*/

char*dirname,/*待访问文件所在的目录*/

char*filename,/*待访问文件的文件名*/

int*pCtrlSock,/*存储返回的文件描述符,也就是常说的fd*/

int*pDataSock/*存储返回的待访问文件的文件描述符*/

此例程按以下顺序发起通过FTP服务器传输文件:

(1)建立一个连接到指定的主机上的FTP服务器;

(2)在指定的主机上设置好用户名,密码和账号;

(3)发送文件传输类型命令;

(4)发送文件所在的目录以及文件名命令;

(5)将指定的转移命令和指定的文件名作为参数,建立一个数据连接。典型的传输命令为STOR%S:写入到一个远程文件;RETR%S:读取一个远程文件。

由此产生的控制和数据连接文件描述符分别通过pCtrlSock和pDataSock返回。

调用这个程序后,数据可以被读取或写入到远程服务器返回的文件描述符pDataSock中。当所有传入的数据被读取(读取数据套接字由EOF表示)和/或所有传出的数据已写入,应关闭数据套接字fd。

这时候应该调用函数ftpReplyGet(),用来接收控制套接字的最后的回复。

intftpReplyGet

intctrlSock,/*连接FTPcontrolsocket文件描述符fd*/

BOOLexpecteof/*TRUE=EOFexpected,FALSE=EOFiserror*/

若没有错误,应调用函数ftpCommand()关闭controlsocket。

intftpCommand

intctrlSock,/*连接FTPcontrolsocket文件描述符fd*/

char*fmt,/*待传递的ftp命令*/

intarg1,/*ftp命令的参数*/

intarg2,

intarg3,

intarg4,

intarg5,

intarg6

如果FTP命令不涉及数据传输(例如文件删除或重命名),pDataSock应该是NULL,在这种情况下,不会建立数据连接。函数返回为OK或ERROR(有socket不能创建或不能进行连接)。

FTP文件传输的全部过程如图3所示。

图3VxWorks下FTP文件传输过程

程序关键代码如下:

/*initiateatransferviaaremoteFTPservertoreadaremotefile*/

if(ERROR==ftpXfer(UNIX_HOST,USER,PASSWD,"","RETR%s",W_DIR,FILE,&ctrlSock,

&dataSock))

{

perror("ErrorininitiatingatransferviaaremoteFTPserver");

returnERROR;

}

/*readtheremotefiledatatobuffer*/

while((NumBytes=read(dataSock,buff,sizeof(buff)))>0)

{

buff+=NumBytes;

}

if(NumBytes

{

perror("Errorinreading");/*readerror*/

return(ERROR);

}

close(dataSock);

/*GetanFTPcommandreplytoseewhetherEOFisencountered*/

if(ftpReplyGet(ctrlSock,TRUE)!=FTP_COMPLETE)

{

perror("positivecompletionfailed");

return(ERROR);

}

/*SendQUITFTPcommand*/

if(ftpCommand(ctrlSock,"QUIT",0,0,0,0,0,0)!=FTP_COMPLETE)

{

perror("QUITFTPcommandpositivecompletionfailed");

return(ERROR);

}

close(ctrlSock);

3分包文件传输协议的制定与实现

3.1分包文件传输协议制定

通过本文前两节的分析和应用,文件已经成功的从上位机下载到了系统控制器的内存当中,本节着重介绍如何从系统控制器的内存中将文件封装成数据包分次传送给DPSRAM,如何通知DSP将数据包取走,如何得到DSP的应答之后传送下一个数据包,如何判断数据包全部传送完成等,简而言之,就是分包文件传输协议的制定,图4用流程图的形式对整个过程进行了详细的描述。

下面以数据包包含的信息要素为例介绍分包文件传输协议,每个数据包包含以下信息要素,如图5所示。

系统控制器将数据包写入DPSRAM之后,会发起DPSRAM左端口中断,DSP检测到中断后从DPSRAM中取走数据包。

控制命令字的主要作用是告知DSP,此数据包数据空间中的数据是用于FLASH更新用的,需要将其写入FLASH中。

数据包长度的主要作用是告知DSP即将要读取的数据包中数据空间的长度,以便DSP将其写入到FLASH对应的空间中。

图4分包文件传送过程

图5数据包的信息要素

数据包序号的主要作用是告知DSP,此次传输的是第几个数据包,防止传输过程中丢包。

数据写入标记分为3种:根据数据包序号,如果传输的是第一个数据包,则表示数据包传输开始;如果传输的是中间的数据包,则表示数据包继续传输;如果接收到的是最后一个数据包,则表示数据包传输完成。

CRC校验和的主要作用是便于DSP比较数据传输之前的检验和与自己根据接收到的数据计算出来的校验和是否一致,借此判断数据传输过程中有无丢数现象发生。文件总的大小的主要作用是告知DSP需要擦除多大的FLASH空间用于存储更新后的文件。

3.2分包文件传输协议实现

协议的实现主要用到了以下几个关键函数:

(1)数据包协议头的封装

UINT32gfWriteLong(UINT32x,UINT32y)

{

*(UINT32*)x=y;

returny;

}

此函数用于封装数据包协议头,将数据包协议头信息写入相应的地址空间中。

(2)CRC校验和算法[6]

本文采用一种按位计算的方法计算校验和,和DSP计算出来的校验和相比较,防止数据传输过程中出现差错,关键代码如下:

UINT32gfCRCCheckSum(char*ptr,unsignedlonglen)

{

unsignedchari;unsignedlongcrc=0;

while(len??!=0)

{

for(i=0x80;i!=0;i/=2)

{

if((crc&0x8000)!=0)

{

crc*=2;

crc^=0x1021;

}

else

{

crc*=2;

}

if((*ptr&i)!=0)

{

crc^=0x1021;

}

}

ptr++;

}

returncrc;

}

(3)应答机制

应答机制的作用是得到DSP接收完一个数据包之后反馈回来的信息(用数值表示),如为数据传输正确,则打印出提示提示语句后接着传送下一个数据包;如为校验和出错,则说明数据包传送过程中发生了丢数等现象,打印出语句后直接结束退出;如为FLASH更新完成,则说明所有数据包传送完成,且正确的写入到FLASH中了,打印出提示语句后直接结束退出;如为FLASH更新出错,则说明所有数据包传送完成,但没有正确的写入到FLASH中,打印出提示语句后直接结束退出。

关键代码如下:

STATUSgfDSPACKCMD(inthandle,UINT32ACKAddress)

{

UINT32ACKCMD;

ACKCMD=*(*ACKAddress);

switch(ACKCMD)

{

caseDSP_ACK_OK:

printf("\nDataPacketSendSuccessandDataRight!\n\n");

break;

caseERROR_CHECKSUM:

printf("\nDatapacketCRCCheckSumERROR!\n");

break;

caseFLASH_UPDATE_OK:

printf("\n\nFlashDataUpdatesOver!!!\n");

break;

caseERROR_FLASH_DATA:

printf("\nFlashdatawriteerror!\n");

break;

default:

printf("\nAcknowledgecommandworderror!\n");

break;

}

returnOK;

}

4实际应用

基于以上分析研究,编写了相应的程序,并在数据采集系统中进行了多次试验,试验结果如表1所示,从试验结果可以看出,本文所介绍的方法可以保证数据传输的准确性,满足了DSP程序在线FLASH更新的需求。

表1FLASH更新测试结果

5结论

本文结合实际项目开发过程中遇到的实际问题,概述了一种VxWorks下简单文件传输的原理和具体的软件实现方法。实际应用证明,按照此种方式编写的程序代码简单,实用,可以很好的进行文件数据分包传输。

参考文献

[1]李署东,吴昊,杜祝.VxWorks下点对点简单文件传输的实现[J].中国水运,2011,11(1):84?87.

[2]唐晓平.VxWorks在cPCI高速数据采集系统中的应用研究[D].长沙:国防科学技术大学,2008.

[3]黄世权.FTP协议分析和安全研究[J].微计算机信息,2008,24(2?3):93?94.

[4]冯先成,李寒,张铁男.基于MPC850VxWorks系统的BSP设计[J].计算机与数字工程,2012,40(6):39?43.

文件传输范文

一、引言

随着计算机应用的不断深入和信息交流的不断增加,许多UNIX系统用户越来越感到,仅由一台高性能微机运行UNIX,带多台至几十台终端已不能满足应用的需要,因此,越来越多的系统正在向多用户网络方向发展。

UNIXTCP/IP网络就是解决上述矛盾的一种系统。它将多台运行UNIX系统的超级微机用电缆线连接起来,采用TCP/IP协议进行通信,任一微机所连接的终端可登录到网上其它任一主机上进行操作,也可以通过网络提供的功能,进行其它网络操作。

SCOUNIXTCP/IP网络系统为用户提供了许多通信功能,它包括远程登录、文件传输、邮件发送以及其它有关网络应用、管理及控制方面的命令。这些功能均在命令级实现,即用户只需在命令提示符下键入相应的命令,即可完成相应的操作。但是,有许多应用系统对网络功能的调用是在应用程序运行过程中的,仅通过命令接口是不能完全满足应用的需要的,因此,用户必须通过网络提供的接口编制自己的网络应用程序。SCOUNIXTCP/IP为用户提供了一组套接字接口,本文将介绍如何通过调用套接字以及TCP/IP提供的库函数编制一个文

件传输应用程序。

二、套接字接口及调用

1.套接字接口

一个用户应用系统,即一个客户进程,通常需要与一个完成其功能有的服务进程进行通信。在UNIX系统中完成这种进程间通信的一个方法是通过管道(PIPES)来实现的,UNIX网络运行系统也提供一个更灵活的强有力的独立子系统以支持一个分布式环境的进程间通信,这个子系统就称作套接字(SOCKET)接口。套接字接口构成了在单个主机内及整个网际间的编程界面和进程间通信的基础。

一个套接字是一个软件实体,它为进程间通信提供了基本的构件,它是进程间通信的端点,对互连网地址来说,下面的一对全名套接字唯一确定了通信双方的连接:

其中,node是4字节地址,port为2字节长,左边的是本地套接字,右边是远程或外部套接字。

套接字具有类型,其类型是由面向程序员的通信特性决定的,它与套接字支持的特殊协议有关。时程通常是在相同类型的套接字之间通信。目前程序员可使用下面三种类型的套接字。

·流套接字:提供双向的、可靠的、有序的且不重复的无记录边界的数据流,它是最常用的一种类型。

·数据报套接字:它支持双向数据流,但记录边界被保持,接收进程必须重新定序,消除重复并提供可靠保证,它适用于单个报文的可靠性不重要的场合。

·原始套接字:使用原始套接字,程序员能访问低层通信协议(如IP),它不是为一般用户设置的,而是为了开发新的通信协议,或是为了访问现有协议中较隐蔽功能而设置的。

2.套接字的调用

TCP/IP的系统调用主要是通过对套接字的操作来实现的,下面给出了部分常用的TCP/IP系统调用:

·scoket创建套接字

·bind为套接字赋一个名字

·connect启动一个连接

·accept接受连接

·listen监听连接

·write/send发送信息

·read/recv接收信息

·close关闭套接字

三、UNIX网络库例程的应用

网络库例程的主要用途是确定和建立网络地址。

在客户方与服务方进行通信前,在远程节点上确定一个服务需要进行多级映射。为便于使用,每个服务被指定一个名字,这个名字必须被翻译成网络地址,最后,该地址被用来确定一个物理位置和到服务的路径。可见,确定远程节点上的一个服务需要三级映射,这三级映射的具体实现随着网络结构不同而有所变化。

UNIX网络库例程是C程序语言函数调用,它提供下列映射的标准例程:

·主机名字到网络地址

·网络地址到网络号

·协议名字到协议号

·服务名字到端口号及服务器使用的适当协议

1.映射主机名字

例程gethostbynamne,gethostbyaddr,gethostent均可完成主机名字与地址映射,它们分别将主机名或节点地址映射成一个hostent结构:

structhostent{

char*h_name;/*正式主机名*/

char**h_aliasea;/*别名表*/

inth_addrtype;/*主机的地址类型*/

inth_length;/*地址长度*/

char**h_addr_list;/*地址表*/

#defineh_addrh_addr_list[0]

}

2.映射网络名字

getnetbyname,getnetbynumber,getnetent是分别用于映射网络名字的例程,使用这些例程,可将网络名映射到网络号,或把网络号映射到网络名,并返回一个netent结构:

structnetent{

char*n_name;/*正式的网络名*/

char**n_aliasea;/*别名表*/

intn_addrtype;/*网络地址类型*/

unsignedlongn_net;/*网络号*/

}

3.映射服务名字

通过指定一个服务名和一个可选的合法协议,例程getservbyname,getservbyport,get

servent映射服务名字到一个servent结构:

structservent{

char*s_name;/*正式的服务名*/

char**s_aliasea;/*别名表*/

ints_port;/*服务驻留的端口号*/

char*s_proto;/*所使用的协议*/

}

四、文件传输程序的编制

利用网络所提供的套接字接口和库例程,采用客户/服务器模式来编制文件传输程序。

程序流程如下:

@@T8S09300.GIF;图1@@

在通信之前,要为服务分配端口地址,这个地址分配是在/etc/services文件中设置的。

服务方进程启动后,它创建套接字,指定服务名和合法协议,并在指定端口地址上监听服务请求。

客户方进程开始后,也要创建套接字,指定服务名和协议号,并启动一个与服务方的连接,连接成功后,则立刻开始数据传送,直到文件传送结束。

五、结束语

本文只是在多用户网络应用方面的一个初控,利用网络所提供的接口,我们可以在更深层次对其进行研究,开发出功能更强、更为灵活、适用的网络应用软件。参考文献