资源简介
该文档实现tftp文件的传输,文档中包括客户端与服务端的代码,供大家学习参考。
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include “define.h“
#include “makepack.h“
int sock = -1;
char desthost[256] = “127.0.0.1“; //目的主机地址,默认为本机
int filemode = TFTP_OCTET; //发送模式为octet
typedef void (* CMDFUNC)(char [][256]int pcount);
typedef struct _cmdnum{
char *cmd; //命令代码
int num; //序号
int paramcount; //参数个数
CMDFUNC callback; //回调函数名
}CMDNUM*PCMDNUM;
/*定义帮助文档*/
char *helptext = “help: 显示帮助信息\n\
connect dest_ip: 连接服务器\n\
exit: 退出程序\n\
get filename: 从服务器端下载文件\n\
put local_fname dest_fname: 向服务器上传文件\n“;
void showhelp (char cmd[][256]int pcount); //显示帮助信息
void connectto (char cmd[][256]int pcount); //连接目的主机
void quit (char cmd[][256]int pcount); //退出
void getfile (char cmd[][256]int pcount); //下载文件
void putfile (char cmd[][256]int pcount); //上传文件
/*定义一个存储回调函数的命令代码数组,其值与不同的命令相对应*/
CMDNUM cmdlist[] = {
{“help“ 10showhelp}
{“connect“21connectto}
{“exit“ 30quit}
{“get“ 41getfile}
{“put“ 52putfile} };
//分开输入的命令字符串得到命令代码及参数
int stripcmd(char *schar cmd[][256])
{
int i=0;
char *token=NULL;
char seps[] = “ \t\n“;
token = strtok( s seps ); /*断开命令与参数*/
while(token!=NULL){
if (i>2) break; /*因为回调函数的参数最多为3个,当识别出的参数多于2个时,忽略多于的*/
strcpy(cmd[i]token);
token = strtok( NULL seps );/*从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。
所有seps中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点*/
i++;
}
return i;
}
//获取命令数组的下标
int getcmdsubscript(char *s)
{
int i = 0;
for(i=0;i if(strcasecmp(scmdlist[i].cmd)==0){
return i;
}
}
return -1;
}
//解析命令回调相应命令处理函数
void parsecmd(char *s)
{
char cmd[3][256];
int pcount = 0;
int subscript = -1;
pcount = stripcmd(scmd); /*分开命令与参数,返回值为参数的个数加1*/
subscript=getcmdsubscript(cmd[0]); /*获取下标*/
if(subscript==-1){
printf(“No such commond \n“);
return;
}
else{
cmdlist[subscript].callback(cmdpcount-1);/*根据命令回调相应的函数*/
}
}
int main(int argc char* argv[])
{
printf(“********************** Welcome! **********************\n\n\
This is a TFTP_client tool.\n\n“);
printf(helptext); //显示帮助信息
printf(“******************************************************\n\n“);
char cmd[256]; //cmd存放接收进来的命令字符
memset(cmd 0 sizeof(cmd));
struct sockaddr_in addr;
memset(&addr 0 sizeof(struct sockaddr_in));
sock = socket(AF_INETSOCK_DGRAM0);
if(sock==-1)
{
printf(“创建SOCKET失败\n“);
exit(0);
}
while(1)
{
ff
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2016-09-02 10:07 tftp_test\
目录 0 2016-09-02 10:10 tftp_test\client\
文件 979 2016-07-13 14:33 tftp_test\client\define.h
文件 1391 2009-09-04 10:10 tftp_test\client\makepack.h
文件 13284 2016-09-02 10:10 tftp_test\client\tftpclient.c
文件 285 2016-07-16 16:19 tftp_test\readMe.txt
目录 0 2016-09-02 10:09 tftp_test\server\
文件 980 2016-07-12 14:29 tftp_test\server\define.h
文件 10523 2016-09-02 10:09 tftp_test\server\tftpServer.c
评论
共有 条评论