客户端应用TUXEDO实现文件传输方法
在客户端,首先设置客户端与服务器端在文件传输中文件块的大小、文件的块标识等基本信息,将字节数比较大的文件分为很多小块,利用TUXEDO的同步调用tpcall方式循环调用后台的文件处理服务,将字节数较大的文件按着块的大小分多次传输到UNIX后台。下面以下载文件为例讲解使用tuxedo同步调用tpcall方式完成文件传输的例子。
首先利用TUXEDO的tpalloc申请需要使用的发送和接收缓存,使用Fchg32函数在缓存中放入服务器端需要的域值:文件块的大小、文件的标识等基本信息。
SndBuf = (FBFR32 *)tpalloc("FML32", NULL, 1024);
iRet = Fchg32(SndBuf,BLOCKSIZE,0,(char *)&lBlockSize,0);
设置完毕后,开始使用同步tpcall调用UNIX后台文件处理FTPSVR服务。
iRet = tpcall("FTPSVR",(char *)SndBuf,0L,(char **)&RcvBuf,(long *)&len,0L);
iRet = Fget32(RcvBuf, FILELEN, 0, (char *)&lFileLen, 0);
接收文件并将第一块数据写入文件
iRet = Fget32(RcvBuf, FILEDATA, 0, pszFileBuf, (FLDLEN32 *)&lFileDataLen);
fp = fopen(pszCltFileName, "wb ");
lBlkLen = fwrite(pszFileBuf,1,lFileDataLen,fp);
同时计算需要调用下载文件服务的次数,多次调用文件服务,将后续文件下载到客户端。
lBlkNum = (lFileLen -1)/lBlockSize 1 ;
for(i=2; i<lBlkNum 1;i ){
……
iRet = tpcall("FTPSVR",(char *)SndBuf,0L,(char **)&RcvBuf,(long *)&len,0L);
Fget32(RcvBuf, FILEDATA, 0, pszFileBuf, (FLDLEN32 *)&lBlockSize);
lBlkLen = fwrite(pszFileBuf, 1, lBlockSize, fp);
……
}
UNIX服务器端实现方法
在Unix服务器端,接收客户端发送过来的缓存内容,如:文件块的大小、文件块内容、文件块标识等。根据文件块的标识移动文件指针来写文件,每次文件指针移动的大小由文件块的大小决定,并将读取的文件块的内容放入输出缓存中,并返回给客户端。Unix服务器端程序例子说明如下:
FTPSVR(TPSVCINFO *rqst)
{
…………
RcvBuf = (FBFR32 *)rqst->data;
iRet = Fget32(RcvBuf, BLOCKID, 0, (char *)&lBlockID, 0);
fp = fopen(pszSvrFileName, "rb");
(fseek(fp, (lBlockID-1)*lBlockSize, 0)!=0)
lReadLen=fread(pszFileBuf, 1, lBlockSize, fp);
Fchg32(SndBuf, FILEDATA, 0, pszFileBuf, (FLDLEN32 )lReadLen);
tpreturn(TPSUCCESS, 0, (char *)SndBuf, 0L, 0);
}
WINDOWS客户端动态链接库的实现
使用PowerBuilder、Delphi、VB等软件不能直接调用 C语言源代码,它们只能调用动态链接库文件。下面我们讲述如何使用VC 6.0将Windows客户端的文件传输的C、TUXEDO代码制作成动态链接库供Power Builder、Delphi、VB等程序调用。
使用VC 可以制作三种DLL,分别是
(1)Non-MFC Dlls
(2).Regular Dlls
(3)Extension Dlls
Non-MFC DLL:指的是不用MFC的类库结构,直接用C语言写的DLL,其输出的函数一般用的是标准C接口,并能被非MFC或MFC编写的应用程序所调用。因为我们不使用MFC类库,所以采用Non-MFC Dlls。
每一个DLL必须有一个入口点,就象用C编写的应用程序,必须有一个main函数一样. DllMain就是一个缺省的函数入口。
创建一个动态链接库,选择File->New菜单,弹出New对话框。在Projects标签页下,选择"Win32 Dynamic-Link Library"。Visual C 就会创建动态链接库所需的工程文件。
创建ftpfile.def文件,这个文件记录了可被外部应用程序使用的DLL库函数名字。这些名字信息和对应的函数位置的信息将被编译进动态链接库文件中,然后应用程序根据函数名字和函数位置对照表来找到对应的函数。ftpfile.def内容如下:
LIBRARY "ftpfile"
EXPORTS
ftpfile;
将ftpfile.def、源程序ftpfile.cpp、头文件public.h和ftpfld.h、tuxedo库文件wtuxws32.lib和libwsc.lib加入到工程中。选择Project->add to project->files.然后开始编译动态链接库生成ftpfile.dll。
代码样例如下:
BOOL WINAPI DllMain( HMODULE hModule, DWORD dwReason, LPVOID lpvReserved )
{
return TRUE;
}
LRESULT WINAPI ftpfile(char* CltFileName,char* SvrFileName,long lBlockSize,long lOptFlag)
{
FBFR32 *RcvBuf,*SndBuf;
int iRet;
long i,lBlkLen,len,lFileLen,lBlkNum;
…………
SndBuf = (FBFR32 *)tpalloc("FML32", NULL, MAXBUFLEN);
if (SndBuf == NULL)
{
userlog("tpalloc sndbuf error errno=[%d] err=[%s]",tpstrerror(tperrno));
tpterm();
return TPALLOCERR;
}
RcvBuf = (FBFR32 *)tpalloc("FML32", NULL, MAXBUFLEN);
iRet = Fchg32(SndBuf,BLOCKSIZE,0,(char *)&lBlockSize,0);
if (iRet <0){
tpfree((char *)SndBuf);
tpfree((char *)RcvBuf);
tpterm();
return FCHGERR;
}
iRet = Fchg32(SndBuf,OPTFLAG,0,(char *)&lOptFlag,0);
……………………………
}
WINDOWS客户端动态链接库的调用
以Power Builder7.0为例,讲述如何在Power Builder中调用文件传输的客户端动态链接库。
首先,在Power Builder声明该函数,声明如下:
Function Integer ftpfile(string CltFileName,string SvrFileName,long lBlockSize,long lOptFlag) LIBRARY "ftpfile.dll"
然后,在程序中就可以应用了。示例如下:
string CltFileName
string SvrFileName
long lBlockSize
long lOptFlag
integer iRet
CltFileName="..\data\report.txt"
SvrFileName="../up/form.txt"
LBlockSize=1024
LOptFlag=1
IRet = ftpfile(CltFileName,SvrFileName,lBlockSize,lOptFlag)
If (iret< 0){
messagebox('系统提示','调用ftpfile函数错误')
return
}