/*******************************************************/
/*File name : tftp_client.c */
/*Design Date: 2004-12-27 */
/*Function : To get or put a file to a TFTP sever */
/*******************************************************/
#include "vxworks.h"
#include "tftpLib.h"
#define BUFFERSIZE 1024
int dataFDr;
int dataFDt;
int errorFd;
char buf [BUFFERSIZE + 1];
/*函数说明:该函数通过调用tftpXfer函数从TFTP SERVER接收文件*/
tftp_test()
{
int num;
int i;
if (tftpXfer ( "100.0.0.254", /* 指定TFTP SEVER的IP地址*/
0, /* 端口号*/
"recvme.txt", /* 指定要从SEVER端接收的文件名*/
"get", /* TFTP command*/
"ascii", /* TFTP transfer mode*/
&dataFDr, /* 返回的文件描述符 */
&errorFd) == ERROR) /* 返回的错误文件描述符 */
return (ERROR);
printf("Get file from tftp server : %s\n","100.0.0.254");
printf("File Name : recvme.txt \n");
printf("Local buffer start address is 0x%8x, Len is %d.\n",buf,sizeof(buf));
taskDelay(10);
while ((num = read (dataFDr, buf, sizeof (buf))) > 0) /*将文件中有所有数据读到一个BUFFER中缓存,以后将用于显示*/
{
taskDelay(1);
}
i=0;
printf("File recvme.txt is :\n\n");
printf("-----------------------------------------\n");
while(buf[i]!=0) /*通过临时的BUFFER将文件中的所有字符打印到SHELL和TARGET*/
{
putchar(buf[i]); /*将文件的所有字符一个一个地打印到SHELL*/
i++;
}
num = read (errorFd, buf, BUFFERSIZE); /*如果有错误出现,则打印该出错信息*/
if (num > 0)
{
buf [num] = '\0';
printf ("YIKES! An error occurred while Receiving!:%s\n", buf);
}
close (errorFd);
}
/*----------------------------------------------------------------------------------------------------
函数说明:该函数通过调用tftpLib库中更底层的函数如tftpInit(),tftpGet(),tftpPut()等从TFTP SERVER接收文件,
然后将接收到的文件加一条回复信息,再以另一个文件名上传到TFTP SERVER.
输入:char* pHost ----------- TFTP sever 的IP
char* pFilename ----------- 要下载的文件名
输出:0:成功
-1 或其它非0值:出错.
------------------------------------------------------------------------------------------------------*/
int tftp_xfer(char* pHost,char* pFilename)
{
int port;
char * pCommand;
char * pMode;
int fd;
int tmpFD;
TFTP_DESC * pTftpDesc;
int status;
int i,num;
char * msg="Reply from TFTP Client.\n";
char * pTxfilename;
port =0;
pCommand="get";
pMode="netascii";
fd=open("tmpfile",0x202,0644); /* 创建一个文件描述符*/
if ((pTftpDesc = tftpInit ()) == NULL) /* 初始化一个TFTP会话*/
return (ERROR);
if ((tftpPeerSet (pTftpDesc, pHost, port) == ERROR) || /* 会该会话设置TFTP SEVER的地址*/
(tftpModeSet (pTftpDesc, pMode) == ERROR)) /* 设置该会话的传送模式*/
{/*出错了,报错并退出*/
(void) tftpQuit (pTftpDesc);/* 退出该TFTP会话*/
return (ERROR);
}
if (strcmp (pCommand, "get") == 0)
{/*TFTP传输命令是GET*/
status = tftpGet (pTftpDesc, pFilename, fd, TFTP_CLIENT);
}
else
{/*非法的TFTP命令,报错*/
errno = S_tftpLib_INVALID_COMMAND;
status = ERROR;
}
lseek(fd,0,0); /* 将文件指针重新设置到文件头*/
while ((num = read (fd, buf, sizeof (buf))) > 0) /* 将文件中有所有数据读到一个BUFFER中缓存,以后将用于显示*/
{
taskDelay(1);
}
i=0;
printf("File FrmServer.txt is :\n\n");
printf("-----------------------------------------\n");
while(buf[i]!=0) /*通过临时的BUFFER将文件中的所有字符打印到SHELL*/
{
putchar(buf[i]); /*将文件的所有字符一个一个地打印到SHELL*/
i++;
}
pCommand="put"; /*指定TFTP command为上传*/
pTxfilename="FrmClient.txt"; /*指定上传后的文件名*/
lseek(fd,0,2); /*重定位文件指针到文件末尾*/
write(fd,msg,24); /*在文件尾添加回复信息"Reply from TFTP Client."*/
lseek(fd,0,0); /*重定位文件指针到文件头*/
if (strcmp (pCommand, "put") == 0)
{/*TFTP传输命令是PUT*/
status = tftpPut (pTftpDesc, pTxfilename, fd, TFTP_CLIENT);
}
else
{/*非法的TFTP命令,报错*/
errno = S_tftpLib_INVALID_COMMAND;
status = ERROR;
}
lseek(fd,0,0); /* 将文件指针重新设置到文件头*/
while ((num = read (fd, buf, sizeof (buf))) > 0) /* 将文件中有所有数据读到一个BUFFER中缓存,以后将用于显示*/
{
taskDelay(1);
}
i=0;
printf("File FrmClient.txt is :\n\n");
printf("-----------------------------------------\n");
while(buf[i]!=0) /*通过临时的BUFFER将文件中的所有字符打印到SHELL*/
{
putchar(buf[i]); /*将文件的所有字符一个一个地打印到SHELL*/
i++;
}
(void) tftpQuit (pTftpDesc); /*退出该TFTP会话*/
close(fd); /*关闭文件描述符*/
remove("tmpfile"); /*删除临时文件*/
return status;
}
/*函数说明:该函数可将接收到的文件以另一个文件名上传到TFTP SERVER
该函数通过调用tftpLib库中更底层的函数如tftpInit(),tftpPut()等从TFTP SERVER接收文件*/
int tftp_send(char* pHost,char* pFilename)
{
int port;
char * pCommand;
char * pMode;
int fd;
int tmpFD;
TFTP_DESC * pTftpDesc;
int status;
int i,num;
char * msg="Reply from TFTP Client.";
port =0;
pCommand="put";
pMode="netascii";
fd=open("tmpfile",0x202,0644); /*创建一个文件描述符*/
lseek(fd,0,2);
lseek(fd,-2,1);
write(fd,msg,24);
lseek(fd,0,0); /* 将文件指针重新设置到文件头*/
if ((pTftpDesc = tftpInit ()) == NULL) /*初始化一个TFTP会话*/
return (ERROR);
if ((tftpPeerSet (pTftpDesc, pHost, port) == ERROR) || /* 会该会话设置TFTP SEVER的地址*/
(tftpModeSet (pTftpDesc, pMode) == ERROR)) /* 设置该会话的传送模式*/
{/*出错了,报错并退出*/
(void) tftpQuit (pTftpDesc);/* 退出该TFTP会话*/
return (ERROR);
}
if (strcmp (pCommand, "put") == 0)
{/*TFTP传输命令是PUT*/
status = tftpPut (pTftpDesc, pFilename, fd, TFTP_CLIENT);
}
else
{/*非法的TFTP命令,报错*/
errno = S_tftpLib_INVALID_COMMAND;
status = ERROR;
}
lseek(fd,0,0); /* 将文件指针重新设置到文件头*/
while ((num = read (fd, buf, sizeof (buf))) > 0) /* 将文件中有所有数据读到一个BUFFER中缓存,以后将用于显示*/
{
taskDelay(1);
}
i=0;
printf("File FrmClient.txt is :\n\n");
printf("-----------------------------------------\n");
while(buf[i]!=0) /*通过临时的BUFFER将文件中的所有字符打印到SHELL和TARGET*/
{
putchar(buf[i]); /*将文件的所有字符一个一个地打印到SHELL*/
i++;
}
(void) tftpQuit (pTftpDesc); /*退出该TFTP会话*/
close(fd); /*关闭文件描述符*/
remove("tmpfile"); /*删除临时文件*/
return
tftp client.rar_tftp_tftp client_tftp 客户端 ⅤC_tftp_client_tftp客户
版权申诉
82 浏览量
2022-09-23
22:34:12
上传
评论
收藏 24KB RAR 举报
钱亚锋
- 粉丝: 86
- 资源: 1万+