简单文件传送协议(TFTP)的C语言实现

合集下载

tftp协议的实现

tftp协议的实现

tftp协议的实现一、tftp协议介绍TFTP是一个传输文件的简单协议,它其于UDP协议而实现,但是我们也不能确定有些TFTP协议是基于其它传输协议完成的。

此协议设计的时候是进行小文件传输的。

因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证,它传输8位数据。

传输中有三种模式:netascii,这是8位的ASCII码形式,另一种是octet,这是8位源数据类型;最后一种mail已经不再支持,它将返回的数据直接返回给用户而不是保存为文件。

二、基于TFTP协议的网络数据包格式---------------------------------------------------| Local Medium | Internet | Datagram | TFTP |---------------------------------------------------可以看出,TFTP是应用层的协议,我们在linux进行编程时,只需要把TFTP 包封装好,然后通过UDP协议进行发送或接收进行了。

三、TFTP数据包类型TFTP支持六种类型的包:opcode operation(2bytes)1 Read request (RRQ)2 Write request (WRQ) RRQ/WRQ包(带扩展选项)通过读其RFC文档可以知道:例如:客户端请求服务器端下载文件zImage,其扩展选项opt1 :timeout 5,opt 2 : blksize 1462optcode filename mode opt1 opt2---------------------------------------------------------------------------------1 | zImage\0 | octet\0 | timeout\05\0 | blksize\01462\0 |---------------------------------------------------------------------------------注意:optcode占用2bytes,如果不带扩展选项,opt1,opt2就不需要添加了。

C语言实现TFTP服务器

C语言实现TFTP服务器
unsigned short int blockNumber;
char data[1024];
};
struct WRQNode
{
unsigned short int opCode;
char filename[256];
char zeros1;
char mode[9];
memcpy(buf + 3, &node.blockNumber, 1);
else
//memcpy(buf + 2, &node.blockNumber, sizeof(node.blockNumber));
{
buf[3] = char(node.blockNumber & 255);
{
printf("Bind() failed.\n");
closesocket(s);
WSACleanup();
return 1;
}
char buf[269],ackBuf[30],recvBuf[255];
memset(buf,0x0,269);
int len=sizeof(SOCKADDR);size;k++)
buf[k]=fgetc(fp);
}
int main(int argc, char* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
}
void parseERR(const char buf[], ERRNode& node)

用C≠实现TFTP协议及其应用

用C≠实现TFTP协议及其应用
数 据 . 有 3种 传 输 模 式 : n e t a s c i i , 特 殊 的 8位 A S C I I 码 ;
o c t e t .8比特 位 组 数 据 类 型 ;ma i l , 目前 已 不 再 支 持 ,它 将 返
每个 T 兀’ P报 文 都 包 含 一 个 2字 节 的操 作 码 。R R Q、W R Q
1所示
L o c a l e d i 1 } l i n t e r n e t l D a t a g r a r a {T F T P
指 示 延 续 传 输 过 程 .如 果 小 于 5 1 2字 节 则 表 示 这 是 最 后 一 个 分
组 ,传 输 终 止 。
2 . 3 A CK报 文
口要 留 出 来 供 服 务 器 进 程 监 听 其 他 的 T F T P客 户 进 程 发 送 的
并发请 求 。
{0 p  ̄ o d e {B l 0 # l
D a t a

2 T F TP报 文及 其选 项

图3 TF TP的 DAT A 报 文 格式
个 T 丌 P分 组 包 含几 个 子域 :本 地 媒 介 头 .I P头 ,数 据
报 文 的 操作 码 分 别 为 0 x 0 1 、0 x 0 2 。文 件 名 指 定 客 户 端要 读 取 或
写 入 的 文件 服务 器 上 的文 件 。 文 件 名 字 段 以 1字 节 长 的 0字 节
回 的 数 据 直 接 返 回 给 用 户 而 不 是 保 存 为 文 件 。T f T r P 的优 点 在
码 字 符 组 成 。以 两 个 字 节 的 回 车字 符 后 跟换 行 字 符 f 简称 C R / L n 作为 行 结束 符 。C R / L F在 这 种格 式 和 本地 主 机使 用 的行 定 界

TFTP协议的SDL设计与C实现

TFTP协议的SDL设计与C实现

实验二 TFTP协议的SDL设计与C实现班级小班序号姓名成绩一协议环境分析●用户要求1)连接功能连接管理采用UDP面向无连接方式。

安全性要求,只允许合法的用户建立连接,可靠性要求,性能要求。

2)文件传输TFTP没有用户权限管理,用户不需要发送用户名或口令,只有文件的读或写权,权限许可时,文件才能被传输。

无证实方式。

传输8位数据。

●通道性质:TFTP客户机和服务器之间的通信是基于UDP/IP协议。

●工作模式:TFTP不支持交互,也没有命令集,因此不允许用户列出目录的内容或者与服务器进行交互,判断可用的文件名称。

TFTP使用客户服务器模式,一般支持两种传输模式:一是,netascii,即8比特ASCII码;二是,Octet,即8比特字节。

可对文件进行读或写。

二协议功能分析●传输开始于客户端发送一个文件读(下载)或写(上载)请求●服务器使用UDP69号端口接收读/写请求,并建立一个新的连接●支持两种数据传输模式netascii和octet●每次传送的数据PDU包含定长512字节数据,不足512字节视为文件的最后一包数据,表示传输结束。

●每块数据按序编号,从1开始●双方都提供确认机制,都提供超时重传●差错包导致传输终止(除源端口错误外),此包无需确认,无需重传●无校验机制A.SDL功能图B.进程图三协议结构设计分类●接收实体和发送实体分层●客户端和服务端●用户●通道接口子层四协议机制设计●流控机制:每个数据包包括一个数据块,客户只有等到服务器的一个确认包以后才会发送下一个数据包,如果一个数据包小于512字节,则表示传输结束。

●转发、确认机制:发送者每次只能发送一个包,以使确认机制可以保证以前发送的包都已经收到。

在一个传输过程中,通信双方既是发送者又是接收者,一方传输数据接收确认,另一方发送确认接收数据。

●错误机制:有许多错误可以导致连接终止,错误用发送错误包的形式通知对方,此包不会被确认,也不需要重传。

C语言菜鸟级文件传输

C语言菜鸟级文件传输
//服务端
#include <stdio.h>
#include <winsock2.h>
#include <sys/stat.h>
#include <windows.h>
#pragma comment( lib, "WS2_32" )
void jindu(unsigned long i, unsigned long cont);
SOCKET FileSock,S; //声明套接字
struct sockaddr_in Local,Remote; // 配置socket相关信息(ip,port...)
char *ip,temp[2048];
int nLen = sizeof(SOCKADDR_IN);
FILE * fstream = NULL ;//文件指针
int flag = 1;
int nNumRead = 0;
unsigned long filesize = 0;
char ch_filesize[15];
memset(ch_filesize, 0, 15);
if (argc == 2) //当有文件路径参数 才打开文件
char temp[2048], ch_filesize[15];
int nNumRead = 0;
SOCKET FileSock;
struct sockaddr_in Remote;
FILE * fstream = NULL;
if (argc != 1)
{
fstream = fopen( argv[2], "wb" );

简述TFTP简单文件传输协议实现过程

简述TFTP简单文件传输协议实现过程

简述TFTP简单文件传输协议实现过程通过本文,你可以了解到◆什么是TFTP协议◆TFTP作用及一般性用途◆如何搭建TFTP并通过实例演示其工作过程◆从协议角度分析TFTP传输过程一、何为TFTP协议TFTP协议,即为Trivial File Transfer Protocol,简单文件传输协议,它是TCP/IP 协议簇中被用来在服务器和客户机之间传输简单文件的协议,从名称上来看似乎和我们常见的FTP协议很类似,其实两者都是用来传输文件,但不同的是,TFTP较FTP在传输文件体积方面要小得多,比较适合在需要传送的小体积文件。

比如在对CISCO设备进行IOS升级或备份时,就是通过此协议连接到CISCO的TFTP服务器进行相关操作。

除此之外,TFTP操作也非常简单,功能也很有限,不能像FTP一样实现例如身份验证、文件目录查询等诸多功能。

二、搭建并测试TFTP1、获取TFTP.EXE这里通过一个实例来向大家演示如何在windows中搭建并使用TFTP服务器。

首先,我们需要获取tftp.exe(请见附件1)。

有两个办法可以获得这个程序:1> 大家可以在windows XP 系统光盘中的i386文件夹中,利用expand命令从tftp.ex_中提取tftp.exe程序。

2> 其实这个程序已经被内置在系统中,大家可以在C:WINDOWSsystem32中找到它。

2、搭建TFTP服务器安装TFTP服务器?听上去似乎好困难,其实很简单,这里所谓的搭建TFTP服务器其实就是将TFTP.exe作为一个服务安装在系统中,使之成为系统内置的一个服务,这样为日后提供稳定的TFTP传输打好基础。

如何将一个程序变成Windows的服务呢?其实可以很多编程语言内置有特定的方法可以实现,但很显然,这样的办法不具备普遍性,这里我想大家推荐一个小工具,它内置于windows2000的Resource Kits,名为Srvinstw,是一个图形化的工具(请见附件2),操作也很简单。

tftp--实现服务器与客户端的下载与上传【转】

tftp--实现服务器与客户端的下载与上传【转】

tftp--实现服务器与客户端的下载与上传【转】项⽬功能:实现服务器与客户端的下载与上传,及linux系统下的tftp功能项⽬名称:tftp--实现服务器与客户端的下载与上传开发环境:linux /C开发⼯具:GCC/GDB⽹络协议:TCP/IP补充说明:程序中默认server端有upload⽂件夹⽤以接收client端上传的数据,client端有download⽂件夹⽤以下载server端的⽂件开发流程:编译流程: server.c -o server client.c -o client运⾏l流程:1. ./server 192.168.1.207(server ip) 8888(port)2. ./client 192.168.1.207 8888调试效果:client 端server 端1.server.c#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdio.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include<signal.h>#include<errno.h>#include <dirent.h>typedef struct {char cmd[10];int size;char buf[1024];}MSG;MSG msg;enum{list,get,put};int do_list(int connect_fd){char buf[1024];int n;int fd;DIR *pdir;struct dirent *pdirent;if((pdir = opendir(".")) == NULL){perror("Fail to open directory ");exit(EXIT_FAILURE);}while((pdirent = readdir(pdir)) != NULL){if(pdirent->d_name[0] == '.' )continue;strcpy(msg.buf,pdirent->d_name);msg.size = strlen(msg.buf);msg.size = send(connect_fd,&msg,sizeof(MSG),0); }msg.size = 0;send(connect_fd,&msg,sizeof(MSG),0);puts("send list successfully");return 0;}int do_get(int connect_fd){char filename[10];int n;int fd;struct stat fileinfo;if(recv(connect_fd,&msg,sizeof(MSG),0) < 0){perror("fail to recv");exit(EXIT_FAILURE);}if(stat(msg.buf,&fileinfo) < 0){perror("fail to stat");msg.size = -1;strcpy(msg.buf,strerror(errno));send(connect_fd,&msg,sizeof(MSG),0);return -1;}msg.size = fileinfo.st_size;strcpy(filename,msg.buf);puts("***********************");printf("send file size : %d\n",msg.size);printf("send filename : %s\n",msg.buf);puts("***********************");if(send(connect_fd,&msg,sizeof(MSG),0) < 0){perror("fail to recv");exit(EXIT_FAILURE);}if((fd = open(msg.buf,O_RDONLY)) < 0){fprintf(stderr,"Fail to open %s, %s\n",msg.buf,strerror(errno));exit(EXIT_FAILURE);}while(1){msg.size = read(fd, msg.buf,sizeof(msg.buf));send(connect_fd,&msg,sizeof(MSG),0);if(msg.size == 0)break;}printf("send file %s successfully\n",filename);return 0;}int do_put(int connect_fd){char buf[1024];int n;int fd;if(recv(connect_fd,&msg,sizeof(msg),0) <= 0){perror("fail to recv");exit(EXIT_FAILURE);}puts("**********************************");printf("upload filename : %s\n",msg.buf);printf("size: %d\n",msg.size);puts("**********************************");strcpy(buf,"./upload/");strcat(buf,msg.buf);if((fd = open(buf,O_WRONLY | O_CREAT | O_TRUNC,0666)) < 0) {perror("Fail to accept");exit(EXIT_FAILURE);}ftruncate(fd,msg.size);while(1){recv(connect_fd,&msg,sizeof(MSG),0);write(fd,msg.buf,msg.size);if(msg.size == 0)break;}printf("send file successfully!\n");exit(EXIT_SUCCESS);}int getcmd(char *pcmd){if(strcmp(pcmd,"list") == 0)return 0;if(strcmp(pcmd,"get") == 0)return 1;if(strcmp(pcmd,"put") == 0)return 2;}void do_task(int connect_fd,char *cmd){MSG msg;switch(getcmd(cmd)){case put:printf("recv file from client...\n");do_put(connect_fd);break;case get:printf("send file to client...\n");do_get(connect_fd);break;case list:printf("send file list to client...\n");do_list(connect_fd);break;default :break;}return;}int do_client(int connect_fd){MSG msg;int n;while(1){if((n =recv(connect_fd,&msg,sizeof(msg),0) )< 0){perror("fail to recv");exit(EXIT_FAILURE);}if(n == 0)break;do_task(connect_fd,msg.cmd);}exit(EXIT_FAILURE);}void signal_handler(int signum){waitpid(-1,NULL,WNOHANG);return;}int main(int argc, const char *argv[]){pid_t pid;int listen_fd;int connect_fd;socklen_t addrlen;struct sockaddr_in peer_addr;struct sockaddr_in server_addr;if(argc < 0){perror("fail to argc");exit(EXIT_FAILURE);}if(signal(SIGCHLD,signal_handler) == SIG_ERR){perror("fail to signal");exit(EXIT_FAILURE);}if((listen_fd = socket(AF_INET,SOCK_STREAM,0) )< 0) {perror("fail to socket");exit(EXIT_FAILURE);}memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(atoi(argv[2]));server_addr.sin_addr.s_addr =inet_addr(argv[1]);if(bind(listen_fd,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0) //描述本机端⼝和IP,要知道数据包发往哪个进程{perror("Fail to bind");exit(EXIT_FAILURE);}if(listen(listen_fd,8 ) < 0)//监听连接的套接字,接收各客户端的请求,返回监听套接字⽂件描述符{perror("Fail to listen");exit(EXIT_FAILURE);}puts("listening ...");addrlen = sizeof(peer_addr);while(1){if((connect_fd = accept(listen_fd,(struct sockaddr *)&peer_addr,&addrlen)) < 0){perror("Fail to accept");//提取客户发过来的请求,返回新的已连接的套接字⽂件描述符exit(EXIT_FAILURE);}puts("*************************");printf("IP : %s\n",inet_ntoa(peer_addr.sin_addr));printf("PORT : %d\n",ntohs(peer_addr.sin_port));puts("*************************");if((pid = fork()) < 0){perror("Fail to listen");exit(EXIT_FAILURE);}if(pid == 0){do_client(connect_fd);}close(connect_fd);}exit(EXIT_FAILURE);}2.client.c#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdio.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include<errno.h>typedef struct {char cmd[10];int size;char buf[1024];}MSG;enum{list,get,put};int do_list(client_fd,pname){MSG msg;int fd;while(1){recv(client_fd,&msg,sizeof(MSG),0);if(msg.size == 0)break;printf("%s\n",msg.buf);}puts("get list successfully");return 0;}int do_get(int client_fd,char *filename){MSG msg;int fd;char buf[1024];strcpy(msg.buf,filename);if(send (client_fd,&msg,sizeof(MSG),0) < 0){perror("Fail to send");exit(EXIT_FAILURE);}recv(client_fd,&msg,sizeof(MSG),0);if(msg.size < 0){printf("Error :%s \n",msg.buf);return -1;}puts("***********************");printf(" download file size : %d\n",msg.size);printf(" download filename : %s\n",msg.buf);puts("***********************");strcpy(buf,"./download/");strcat(buf,msg.buf);if((fd = open(buf,O_WRONLY | O_CREAT | O_TRUNC,0666)) < 0) {fprintf(stderr,"Fail to open %s,%s\n",buf,strerror(errno));exit(EXIT_FAILURE);}ftruncate(fd, msg.size);while(1){recv(client_fd,&msg,sizeof(MSG),0);if(msg.size == 0)break;write(fd,msg.buf,msg.size);}printf("download file %s successfully\n",filename);return 0;}int do_put(int client_fd,char *filename){MSG msg;int fd;int n;if((fd = open(filename,O_RDONLY)) < 0){perror("Fail to open");exit(EXIT_FAILURE);}msg.size = lseek(fd,0,SEEK_END);strcpy(msg.buf,filename);lseek(fd,0,SEEK_SET);puts("**********************************");printf("filename : %s\n",msg.buf);printf("size :%d\n",msg.size);puts("**********************************");if(send(client_fd,&msg,sizeof(MSG),0) < 0){perror("Fail to send");exit(EXIT_FAILURE);}while(1){msg.size = read(fd,msg.buf,sizeof(msg.buf));if(send(client_fd,&msg,sizeof(MSG),0) < 0){perror("Fail to read");exit(EXIT_FAILURE);}if(msg.size == 0)break;}printf("upload file successfully!\n");return 0;}int getcmd(char *pcmd){if(strcmp(pcmd,"list") == 0)return 0;if(strcmp(pcmd,"get") == 0)return 1;if(strcmp(pcmd,"put") == 0)return 2;}int do_task(char *pcmd,char *pname,int client_fd){MSG msg;char buf[1024];int fd;switch(getcmd(pcmd)){case list:printf("get file list from the server ...\n");strcpy(msg.cmd,pcmd);if(send(client_fd,&msg,sizeof(MSG),0) < 0){perror("FAIL to send");exit(EXIT_FAILURE);}do_list(client_fd,pname);break;case get:printf("file %s is downloading from server ...\n",pname); strcpy(msg.cmd , pcmd);if(send(client_fd,&msg,sizeof(MSG),0) < 0){perror("FAIL to send");exit(EXIT_FAILURE);}do_get(client_fd,pname);break;case put:printf(" file %s is uploading to server ...\n",pname);strcpy(msg.cmd,pcmd);if(send(client_fd,&msg,sizeof(MSG),0) < 0){perror("Fail to send!");exit(EXIT_FAILURE);}do_put(client_fd,pname);break;default:break;}return 0;}int main(int argc, const char *argv[]){MSG msg;char buf[1024];char *pname,*pcmd;int client_fd;pid_t pid;int connect_fd;socklen_t addrlen;struct sockaddr_in server_addr;if((client_fd = socket(AF_INET,SOCK_STREAM,0) )< 0){perror("fail to socket");exit(EXIT_FAILURE);}memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr =inet_addr(argv[1]);server_addr.sin_port = htons(atoi(argv[2]));if(connect(client_fd,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0) {perror("Fail to accept");exit(EXIT_FAILURE);}while(1){printf("tftp>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf) -1] = '\0';if(strncmp(buf,"quit",4) == 0)break;pcmd = strtok(buf," ");pname = strtok(NULL," ");do_task(pcmd,pname,client_fd);}exit(EXIT_FAILURE);return 0;}。

如何基于c语言tftp服务器与客户端实现_华清远见

如何基于c语言tftp服务器与客户端实现_华清远见

如何基于c语言tftp服务器与客户端实现_华清远见如何基于c语言tftp服务器与客户端实现本篇文章主要的内容就是教大家,如何基于c语言tftp服务器与客户端实现,是非常精彩的内容,希望对大家的学习之路有所帮助。

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。

端口号为69。

开发环境:ubuntu所用知识点:c,socket, tcp/ip协议A)本实验主要实现tftp协议的服务器与客户端。

服务器实现功能有:1)接收处理客户端请求,上传下下载文件2)进行用户验证3)对传输数据进行加密解密处理4)生成日志文件客户端实现功能有:1)向服务器发出请求,上传或下载文件2)对传输数据加密解密3)对用户信息进行MD5加密B)相关代码实现:宏定下:#ifndef MAKEWORD#define MAKEWORD(l,h) ((unsigned short)(((unsigned char)(l))|(((unsigned short)(unsigned char)(h))<<8)))#endif#define WSA_MAJOR_VERSION 1#define WSA_MINOR_VERSION 1#define WSA_VERSION MAKEWORD(WSA_MAJOR_VERSION, WSA_MINOR_VERSION)#define TFTP_OCTET 1#define TFTP_WSTAT_FIRSTACK 0#define TFTP_WSTAT_NEXTACK 1#define TFTP_WSTAT_LASTACK 2#define TFTP_RRQ 1 //读请求#define TFTP_WRQ 2 //写请求#define TFTP_DATA 3 //数据#define TFTP_ACK 4 //ACK#define TFTP_ERROR 5 //Error#define MAX_RETRY 3 //最大重复次数#define TFTP_NOTEND_DATALEN 512+2+2 //数据块长度//错误种类#define Not_defined 0#define File_not_found 1#define Access_violation 2#define Disk_full 3#define Illegal_TFTP_operation 4#define Unknown_port 5#define File_already_exists 6#define No_such_user 7#define Time_out 8#define Read_file_Error 9#define Cannot_create_file 10#define passwd_or_user_error 11包的填充:#include "define.h"#include#includeint makeack(unsigned short num,char *buffer,int size );int makedata(unsigned short num,char *data,intdatasize,char *buffer,int bufsize); int makeerr(unsigned short num,char *buffer);//ACK包填充int makeack(unsigned short num,char *buffer,int size ){int pos = 0;buffer[pos] = 0;pos++;buffer[pos] = TFTP_ACK; //操作码为04pos++;buffer[pos] = (char)(num>>8);//块号2个字节pos++;buffer[pos] = (char)num;pos++;return pos;}//Data包填充int makedata(unsigned short num,char *data,int datasize,char *buffer,int bufsize){int pos = 0;buffer[pos] = 0;pos++;buffer[pos] = TFTP_DATA; //操作码为03pos++;buffer[pos] = (char)(num>>8);//块号pos++;buffer[pos] = (char)num;pos++;memcpy(&buffer[pos],data,datasize);//填充数据pos = pos +datasize;return pos;}//ERROR包填充int makeerr(unsigned short num,char *buffer) {int pos=0;buffer[pos]=0;pos++;buffer[pos]=TFTP_ERROR; //操作码为05pos++;buffer[pos] = (char)(num>>8); //错误种类号pos++;buffer[pos] = (char)num;pos++;return pos;}日志log.c实现#includestatic char log[100]; //日志char datetime[20]; //记录时间变量int timeout=2,retran=3; //服务器参数void record(int a,struct sockaddr_in *sin,char *file){char tem[60];time_t t=time(0); //初始化日历时间strftime(datetime,sizeof(datetime),"%y/%m/%d %X",localti me(&t));//将时间格式化strcat(log,datetime);//将时间写入记录//将字符串格式化bzero(&tem,sizeof(tem));if(a==1)sprintf(tem," 收到来自%s 上传文件%s 的请求。

使用TFTP进行文件传输

使用TFTP进行文件传输

使用TFTP进行文件传输使用TFTP进行文件传输(系统版本: Ubuntu 14.04或以上)在嵌入式系统开发中,经常需要从主机上传送映像、文件等到目标机上。

实现的方法有很多。

如tftp,scp等。

TFTP(Trivial File Transfer Protocol)是用来下载远程文件的最简单的网络协议,它基于UDP协议而实现。

一、TFTP的建立嵌入式linux的tftp开发环境包括两个方面:一是linux服务器端的tftp-server支持,二是嵌入式目标系统的tftp-client支持。

因为u-boot本身内置支持tftp-client,所以嵌入式目标系统端就不用配置了。

我们要做的是在服务器端(即主机)上安装TFTP服务,并且正确地配置TFTP服务的路径和参数。

下面我尝试了搭建TFTP的方法,实测成功。

首先需要安装:tftp-hpasudoapt-get install tftp-hpasudoapt-get install tftpd-hpatftp-hpa是客户端,作用是从别人的TFTP服务器端上传/下载东西。

tftpd-hpa是服务端,字母d代表daemon,作用是为别人提供TFTP服务,供别人上传/下载东西。

2、创建TFTP目录首先需要建立一个TFTP目录,以供上传和下载。

当然也可以使用现有的目录。

然后需要设定该目录的权限,决定是否能够下载和上传文件。

对于日常使用,我们一般就将其权限设置为最高,为所有用户组都添加所有权限(读+写+执行=4+2+1=7):sudomkdir ~/tftp_bootsudochmod 777 tftp_boot –R我们的TFTP目录为/home/ghostar/tftp_boot,其权限已经是最高。

3、修改配置文件修改tftpd-hpa相应的配置文件sudogedit /etc/default/tftpd-hpa原始的内容如下:#/etc/default/tftpd-hpaTFTP_USERNAME="tftp"TFTP_DIRECTORY="/var/lib/tftpboot"TFTP_ADDRESS="[...]:69"TFTP_OPTIONS="--secure"我将其修改为:#/etc/default/tftpd-hpaTFTP_USERNAME="ghostar"TFTP_DIRECTORY="/home/ghostar/tftp_boot"TFTP_ADDRESS="0.0.0.0:69"TFTP_OPTIONS="-l-c -s"说明:TFTP_USERNAME:必须改为当前的用户名,或者root;TFTP_DIRECTORY:我们设定的TFTP根目录;TFTP_OPTIONS:TFTP启动参数。

谢希仁《计算机网络》(第5版)笔记和课后习题(含考研真题)详解-应用层(圣才出品)

谢希仁《计算机网络》(第5版)笔记和课后习题(含考研真题)详解-应用层(圣才出品)

第6章应用层6.1复习笔记一、域名系统DNS(一)域名系统概述域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换为IP地址。

因特网的域名系统DNS被设计成一个联机分布式数据库系统,并采用客户/服务器方式。

DNS使大多数名字都可以在本地进行解析(Resolve),仅少量解析需要在因特网上通信,因此DNS系统的效率很高。

(二)因特网的域名结构DNS规定,域名中的标号都由英文字母和数字组成,每一个标号不超过63个字符,也不区分大小写字母。

标号中除连字符(-)外不能使用其他的标点符号。

级别最低的域名写在最左边,而级别最高的顶级域名则写在最右边。

由多个标号组成的完整域名总共不超过255个字符。

如图6-1所示列举了一些域名作为例子。

图6-1因特网的域名空间(三)域名服务器如图6-2所示可看出,因特网上的DNS域名服务器也是按照层次安排的。

图6-2树状结构的DNS域名服务器1.主机向本地域名服务器的查询一般采用递归查询(Recursive Query)方式。

所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文(即替该主机继续查询),而不是让该主机自己进行下一步的查询。

因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址;2.本地域名服务器向根域名服务器的查询通常是采用迭代查询(Iterative Query)。

迭代查询的特点是:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”。

然后让本地域名服务器进行后续的查询(而不是替本地域名服务器进行后续的查询)。

如图6-3所示用例子说明了这两种查询的区别。

图6-3DNS查询举例:(a)本地域名服务器采用迭代查询;(b)本地域名服务器采用递归查询二、文件传送协议(一)FTP概述文件传送协议FTP(File Transfer Protocol)是因特网上使用最广泛的文件传送协议。

文件传输C语言实现

文件传输C语言实现

////////////////////////////////////#include <netinet/in.h> // for sockaddr_in#include <sys/types.h> // for socket#include <sys/socket.h> // for socket#include <stdio.h> // for printf#include <stdlib.h> // for exit#include <string.h> // for bzero#include <time.h> //for time_t and time#define HELLO_WORLD_SERVER_PORT 7754#define LENGTH_OF_LISTEN_QUEUE 20#define BUFFER_SIZE 1024int main(int argc, char **argv){struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htons(INADDR_ANY);server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);// time_t now;FILE *stream;int server_socket = socket(AF_INET,SOCK_STREAM,0);if( server_socket < 0){printf("Create Socket Failed!");exit(1);}if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))) {printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT); exit(1);}if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ){printf("Server Listen Failed!");}while (1)struct sockaddr_in client_addr;socklen_t length = sizeof(client_addr);int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length); if ( new_server_socket < 0){printf("Server Accept Failed!\n");break;}char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);strcpy(buffer,"Hello,World! ");strcat(buffer,"\n"); //send(new_server_socket,buffer,BUFFER_SIZE,0);bzero(buffer,BUFFER_SIZE);= recv(new_server_socket,buffer,BUFFER_SIZE,0);if (length < 0){printf("Server Recieve Data Failed!\n");exit(1);}printf("\n%s",buffer);if((stream = fopen("z.mp3","r"))==NULL){printf("The file 'data1' was not opened! \n");exit(1);}elseprintf("The file 'filename' was opened! \n");bzero(buffer,BUFFER_SIZE);int lengsize = 0;while((lengsize = fread(buffer,1,1024,stream)) > 0){printf("lengsize = %d\n",lengsize);if(send(new_server_socket,buffer,lengsize,0)<0){printf("Send File is Failed\n");break;}bzero(buffer, BUFFER_SIZE);}if(fclose(stream))printf("The file 'data' was not closed! \n");exit(1);close(new_server_socket);}close(server_socket);return 0;}//client.c////////////////////////////////////#include <netinet/in.h> // for sockaddr_in#include <sys/types.h> // for socket#include <sys/socket.h> // for socket#include <stdio.h> // for printf#include <stdlib.h> // for exit#include <string.h> // for bzero#include <time.h> //for time_t and time #include <arpa/inet.h>#define HELLO_WORLD_SERVER_PORT 7754#define BUFFER_SIZE 1024int main(int argc, char **argv){if (argc != 2){printf("Usage: ./%s ServerIPAddress\n",argv[0]);exit(1);}//time_t now;FILE *stream;struct sockaddr_in client_addr;bzero(&client_addr,sizeof(client_addr));client_addr.sin_family = AF_INET;client_addr.sin_addr.s_addr = htons(INADDR_ANY);client_addr.sin_port = htons(0);int client_socket = socket(AF_INET,SOCK_STREAM,0);if( client_socket < 0){printf("Create Socket Failed!\n");exit(1);}if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr))){printf("Client Bind Port Failed!\n");exit(1);}struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr));server_addr.sin_family = AF_INET;if(inet_aton(argv[1],&server_addr.sin_addr) == 0){printf("Server IP Address Error!\n");exit(1);}server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);socklen_t server_addr_length = sizeof(server_addr);if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0) {printf("Can Not Connect To %s!\n",argv[1]);exit(1);}char buffer[BUFFER_SIZE];bzero(buffer,BUFFER_SIZE);int length = recv(client_socket,buffer,BUFFER_SIZE,0);if(length < 0){printf("Recieve Data From Server %s Failed!\n", argv[1]); exit(1);}printf("\n%s\n",buffer);bzero(buffer,BUFFER_SIZE);bzero(buffer,BUFFER_SIZE);strcpy(buffer,"Hello, World! From Client\n");send(client_socket,buffer,BUFFER_SIZE,0);if((stream = fopen("data","w+t"))==NULL){printf("The file 'data' was not opened! \n");}elsebzero(buffer,BUFFER_SIZE);length = 0;while( length = recv(client_socket,buffer,BUFFER_SIZE,0)) {if(length < 0){printf("Recieve Data From Server %s Failed!\n", argv[1]); break;}int write_length = fwrite(buffer,sizeof(char),length,stream); if (write_length<length){printf("File is Write Failed\n");break;}bzero(buffer,BUFFER_SIZE);}printf("Recieve File From Server[%s] Finished\n", argv[1]); fclose(stream);close(client_socket);return 0;}。

TFTP

TFTP

tftp求助编辑展开编辑本段目的TFTP是一个传输文件的简单协议,它基于UDP协议而实现,但是我们也不能确定有些TFTP协议是基于其它传输协议完成的。

此协议设计的时候是进行小文件传输的。

因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证,它传输8位数据。

传输中有三种模式:netascii,这是8位的ASCII码形式,另一种是octet,这是8位源数据类型;最后一种mail已经不再支持,它将返回的数据直接返回给用户而不是保存为文件。

编辑本段概况任何传输起自一个读取或写入文件的请求,这个请求也是连接请求。

如果服务器批准此请求,则服务器打开连接,数据以定长512字节传输。

每个数据包包括一块数据,服务器发出下一个数据包以前必须得到客户对上一个数据包的确认。

如果一个数据包的大小小于512字节,则表示传输结束。

如果数据包在传输过程中丢失,发出方会在超时后重新传输最后一个未被确认的数据包。

通信的双方都是数据的发出者与接收者,一方传输数据接收应答,另一方发出应答接收数据。

大部分的错误会导致连接中断,错误由一个错误的数据包引起。

这个包不会被确认,也不会被重新发送,因此另一方无法接收到。

如果错误包丢失,则使用超时机制。

错误主要是由下面三种情况引起的:不能满足请求,收到的数据包内容错误,而这种错误不能由延时或重发解释,对需要资源的访问丢失(如硬盘满)。

TFTP 只在一种情况下不中断连接,这种情况是源端口不正确,在这种情况下,指示错误的包会被发送到源机。

这个协议限制很多,这些都是为了实现起来比较方便而进行的。

编辑本段与其它协议的联系因为TFTP使用UDP,而UDP使用IP,IP可以还使用其它本地通信方法。

因此一个TFTP包中会有以下几段:本地媒介头,IP头,数据报头,TFTP 头,剩下的就是TFTP数据了。

TFTP在IP头中不指定任何数据,但是它使用UDP中的源和目标端口以及包长度域。

TCP_IP协议014_TFTP:简单文件传送协议

TCP_IP协议014_TFTP:简单文件传送协议

wangzhanf@
20042004-embed
在开始工作时,T F T P的客户与服务器交换信息, 客户发送一个读请求或写请求给服务器。在一个 无盘系统进行系统引导的正常情况下,第一个请 求是读请求( R R Q)。
wangzhanf@
wangzhanf@
20042004-embed
5种TFTP报文格式
20042004-embed
安全性
在T F T P分组中并不提供用户名和口令。这是T F T P的 一个特征(即“安全漏洞”)。由于T F T P是设计用于 系统引导进程,它不可能提供用户名和口令。 T F T P的这一特性被许多解密高手用于获取U n i x口令 文件的复制,然后来猜测用户口令。为防止这种类型的访 问,目前大多数T F T P服务器提供了一个选项来限制只 能访问特定目录下的文件( U n i x系统中通常是/ t f t p b o o t)。这个目录中只包含无盘系统进行系统引导时所需 的文件。 对其他的安全性, U n i x系统下的T F T P服务器通常将 它的用户I D和组I D设置为不会赋给任何真正用户的值。 这只允许访问具有读或写属性的文件。
wangzhanf@
20042004-embed
TCP_IP协议_TFTP:简单文件传送协议
wangzhanf@
王占峰 wangzhanf@
20042004-embed
基础
T F T P ( Trivial File Transfer Protocol)即简单文 件传送协议,最初打算用于引导无盘系统(通常 是工作站或X终端)。和使用T C P的文件传送协 议( F T P)不同,为了保持简单和短小, T F T P使用 P和设备驱动程序)都能适合只读存储器。

用标准C语言编写一个ftp协议上传文件的简单程序

用标准C语言编写一个ftp协议上传文件的简单程序

sunkaidong 发表于 2008-1-11 12:57
是啊,很困难,但是只有困难才有意思啊.羡慕黑客,不如自己漫漫学习写程序,有一天你会觉得写程序很简单很好玩啊
VxWorks 发表于 2008-1-11 13:06
没有想象中的那么难。给个TCP协议传输数据的例子看看:
服务器端:[code]#include <stdio.h> #include <winsock2.h> #include <time.h> #pragma comment(lib,"ws2_32.lib ")
//构建本地地址信息 saServer.sin_family = AF_INET; saServer.sin_port = htons(SERVER_PORT); saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//绑定 ret = bind(sListen,(struct sockaddr *)&saServer,sizeof(saServer)); if( ret == SOCKET_ERROR) {
Sleep((DWORD)100); }
closesocket(sListen); WSACleanup();
puts("press Enter to exit!"); getchar(); return 0;
}[/code]客户端:[code]#include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib ")
WSACleanup(); printf("socket() failed \n"); return 3; }

利用VC实现TFTP协议

利用VC实现TFTP协议
3.4 正常终止
传输的结束由 DATA 数据标记,数据区为 0-511 个字符。这个包可以被 ACK 数据包确认。 接收方在发出对最后数据包的确认后可以断开连接,当然,适当的等待是比较好的,如果最 后的确定包丢失可以再次传输。如果发出确认后仍然收到最后数据包,可以确定最后的确认 丢失。发送最后一个 DATA 包的主机必须等待对此包的确认或超时。如果响应是 ACK,传输 完成。如果发送方超时并不准备重新发送并且接收方有问题或网络有问题时,发送也正常结 束。也有可能这种情况传输是不成功的,但无论如何连接都将被关闭。
char *cmd;
//命令代码
int num;
//序号
int paramcount;
//参数个数
CMDFUNC callback; //回调函数名
}CMDNUM,*PCMDNUM;
/*定义帮助文档*/
char *helptext = "help:
显示帮助信息\n\
connect dest_ip:
3.3 初始链接
初始连接时候需要发出 WRQ(请求写入远程系统)或 RRQ(请求读取远程系统),收到 一个确定应答,是确定可以写出的包或应该读取的第一块数据。通常确认包包括要确认的包 的包号,每个数据包都与一个块号相对应,块号从 1 开始而且是连续的。因此对于写入请求 的确定是一个比较特殊的情况,因此它的包的包号是 0。如果收到的包是一个错误的包,则 这个请求被拒绝。创建连接时,通信双方随机选择一个 TID,是随机选择的,因此两次选择 同一个 TID 的可能性就很小了。每个包包括两个 TID,发送者 TID 和接收者 TID。这些 TID 用于在 UDP(或其他数据包协议)通信时选择端口,请求主机选择 TID 的方法上面已经说过了,

标准C语言实现基于TCPIP协议的文件传输

标准C语言实现基于TCPIP协议的文件传输

/*客户机源程序khj.c*/ #include >stdio.h> #include >sys/types.h> #include >sys/fcntl.h> #include >sys/socket.h> #include >sys/netinet/in.h> #include >netdb.h> #include >errno.h> #include >string.h> main() { char buf[1024],file[30]; char *strs=″ conveying,waiting...″; int target; register int k,s; struct sockaddr_in sin; struct hostent *hp; system(″clear″); printf(″ ″);
连接请求到达。连接成功后,该调用将用对端的地址结构和地址长度填充参数peer和addlen,如果对客户端的地址信息不感兴趣,这两个参 数用0代替。 5.客户端调用connect()与服务器建立连接。格式为: connect(int socketfd,struct sockaddr_in *servsddr,int addrlen) 客户端取得套接字描述符后,用该调用建立与服务器的连接,参数socketfd为socket()系统调用返回的套节字描述符,第二和第三个参数 是指向目的地址的结构及以字节计量的目的地址的长度(这里目的地址应为服务器地址)。调用成功返回0,否则将返回-1并设置errno。 6.通过软插座发送数据 一旦建立连接,就可以用系统调用read和write像普通文件那样向网络上发送和接受数据。Read接受三个参数:一个是套节字描述符; 一个为数据将被填入的缓冲区,还有一个整数指明要读的字节数,它返回实际读入的字节数,出错时返回-1,遇到文件尾则返回0。Write 也接受三个参数:一个是套节字描述符;一个为指向需要发送数据的缓冲区,还有一个整数指明要写入文件的字节个数,它返回实际写入的 字节数,出错时返回-1。当然,也可以调用send和recv来对套节字进行读写,其调用与基本的read和write系统调用相似,只是多了一个发 送方式参数。 7.退出程序时,应按正常方式关闭套节字。格式如下: int close(socketfd) 前面介绍了UNIX客户/服务器模式网络编程的基本思路和步骤。值得指出的是socket编程所涉及的系统调用不属于基本系统调用范围, 其函数原形在libsocket.a文件中,因此,在用cc命令对原程序进行编译时需要带-lsocket选项。 现在,我们可以针对文章开头提出的问题着手进行编程了。在图示的网络结构中,为使中心机房的服务器能和网点上的客户机进行通 信,需在服务器端添加通过路由器1 1 1 2到客户机的路由,两台客户机也必须添加通过路由器2 2 2 1到服务器的路由。在服务器的/etc/hosts 文件中应该包含下面内容: 1.1.1.1 server 2.2.2.2 cli1 2.2.2.3 cli2 客户机的/etc/hosts文件中应该有本机地址信息和服务器的地址信息,如cli1客户机的/etc/hosts文件: 2.2.2.2 cli1 1.1.1.1 server 网络环境搭建好后,我们可以在服务器端编写fwq.c程序,负责接受客户机的连接请求,并将从源文件中读取的数据发送到客户机。客 户机程序khj.c向服务器发送连接请求,接收从服务器端发来的数据,并将接收到的数据写入目标文件。

图文简述TFTP简单文件传输协议实现过程

图文简述TFTP简单文件传输协议实现过程

图文简述TFTP简单文件传输协议实现过程本文将从概念、操作实例以及协议分析等几个步骤来粗略理解TFTP协议。

通过本文,你可以了解到◆什么是TFTP协议◆TFTP作用及一般性用途◆如何搭建TFTP并通过实例演示其工作过程◆从协议角度分析TFTP传输过程一、何为TFTP协议TFTP协议,即为Trivial File Transfer Protocol,简单文件传输协议,它是TCP/IP协议簇中被用来在服务器和客户机之间传输简单文件的协议,从名称上来看似乎和我们常见的FTP协议很类似,其实两者都是用来传输文件,但不同的是,TFTP较FTP在传输文件体积方面要小得多,比较适合在需要传送的小体积文件。

比如在对CISCO设备进行IOS升级或备份时,就是通过此协议连接到CISCO 的TFTP服务器进行相关操作。

除此之外,TFTP操作也非常简单,功能也很有限,不能像FTP一样实现例如身份验证、文件目录查询等诸多功能。

二、搭建并测试TFTP1、获取TFTP.EXE这里通过一个实例来向大家演示如何在windows中搭建并使用TFTP服务器。

首先,我们需要获取tftp.exe(请见附件1)。

有两个办法可以获得这个程序:1> 大家可以在windows XP 系统光盘中的i386文件夹中,利用expand命令从tftp.ex_中提取tftp.exe程序。

2> 其实这个程序已经被内置在系统中,大家可以在C:\WINDOWS\system32中找到它。

2、搭建TFTP服务器安装TFTP服务器?听上去似乎好困难,其实很简单,这里所谓的搭建TFTP服务器其实就是将TFTP.exe作为一个服务安装在系统中,使之成为系统内置的一个服务,这样为日后提供稳定的TFTP传输打好基础。

如何将一个程序变成Windows的服务呢?其实可以很多编程语言内置有特定的方法可以实现,但很显然,这样的办法不具备普遍性,这里我想大家推荐一个小工具,它内置于windows2000的Resource Kits,名为Srvinstw,是一个图形化的工具(请见附件2),操作也很简单。

[VIP专享]如何基于c语言tftp服务器与客户端实现_华清远见

[VIP专享]如何基于c语言tftp服务器与客户端实现_华清远见

如何基于c语言tftp服务器与客户端实现本篇文章主要的内容就是教大家,如何基于c语言tftp服务器与客户端实现,是非常精彩的内容,希望对大家的学习之路有所帮助。

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。

端口号为69。

开发环境:ubuntu所用知识点:c,socket, tcp/ip协议A)本实验主要实现tftp协议的服务器与客户端。

服务器实现功能有:1)接收处理客户端请求,上传下下载文件2)进行用户验证3)对传输数据进行加密解密处理4)生成日志文件客户端实现功能有:1)向服务器发出请求,上传或下载文件2)对传输数据加密解密3)对用户信息进行MD5加密B)相关代码实现:宏定下:#ifndef MAKEWORD#define MAKEWORD(l,h) ((unsigned short)(((unsigned char)(l))|(((unsigned short)(unsigned char)(h))<<8)))#endif#define WSA_MAJOR_VERSION 1#define WSA_MINOR_VERSION 1#define WSA_VERSION MAKEWORD(WSA_MAJOR_VERSION, WSA_MINOR_VERSION) #define TFTP_OCTET 1#define TFTP_WSTAT_FIRSTACK 0#define TFTP_WSTAT_NEXTACK 1#define TFTP_WSTAT_LASTACK 2#define TFTP_RRQ 1 //读请求#define TFTP_WRQ 2 //写请求#define TFTP_DATA 3 //数据#define TFTP_ACK 4 //ACK#define TFTP_ERROR 5 //Error#define MAX_RETRY 3 //最大重复次数#define TFTP_NOTEND_DATALEN 512+2+2 //数据块长度//错误种类#define Not_defined 0#define File_not_found 1#define Access_violation 2#define Disk_full 3#define Illegal_TFTP_operation 4#define Unknown_port 5#define File_already_exists 6#define No_such_user 7#define Time_out 8#define Read_file_Error 9#define Cannot_create_file 10#define passwd_or_user_error 11包的填充:#include "define.h"#include#includeint makeack(unsigned short num,char *buffer,int size );int makedata(unsigned short num,char *data,int datasize,char *buffer,int bufsize); int makeerr(unsigned short num,char *buffer);//ACK包填充int makeack(unsigned short num,char *buffer,int size ){int pos = 0;buffer[pos] = 0;pos++;buffer[pos] = TFTP_ACK; //操作码为04pos++;buffer[pos] = (char)(num>>8);//块号2个字节pos++;buffer[pos] = (char)num;pos++;return pos;}//Data包填充int makedata(unsigned short num,char *data,int datasize,char *buffer,int bufsize){int pos = 0;buffer[pos] = 0;pos++;buffer[pos] = TFTP_DATA; //操作码为03pos++;buffer[pos] = (char)(num>>8);//块号pos++;buffer[pos] = (char)num;pos++;memcpy(&buffer[pos],data,datasize);//填充数据pos = pos + datasize;return pos;}//ERROR包填充int makeerr(unsigned short num,char *buffer) {int pos=0;buffer[pos]=0;pos++;buffer[pos]=TFTP_ERROR; //操作码为05pos++;buffer[pos] = (char)(num>>8); //错误种类号pos++;buffer[pos] = (char)num;pos++;return pos;}日志log.c实现#includestatic char log[100]; //日志char datetime[20]; //记录时间变量int timeout=2,retran=3; //服务器参数void record(int a,struct sockaddr_in *sin,char *file){char tem[60];time_t t=time(0); //初始化日历时间strftime(datetime,sizeof(datetime),"%y/%m/%d %X",localtime(&t));//将时间格式化strcat(log,datetime);//将时间写入记录//将字符串格式化bzero(&tem,sizeof(tem));if(a==1)sprintf(tem," 收到来自 %s 上传文件 %s 的请求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

文件: 据:
WSADTA WSAData; 送文件给客户端f接收文件或数据与之类
WSAStartup(MAKEWORD(2,2),&WSADa— 似1:
ta); Sendto(sock, (char书) &SendBuff,i+4,
创建套接字: MSG_DONTROUTE,(struct sockaddr宰)&Client,
Struct sockaddr_in ServerAddr; {
ServerAddr.sin_family=AF_INET; inti,j;
ServerAddr.sin_addr=inet_addr(MYIp);/ *type=(buff[1】==’13 9"r7:,w7;判断
摘 要:’rFTP(简单文件传送协议)是TCP/TP协议族中用来在客户机与服务器之间进行简单
文件传输的协议。文中给出了在visual C++6.0开发平台上,用C语言按照聊协议在服务器
跟多客户端之间进行文件传榆的实现方法。该方法可以传输超过32MB的文件。
INT8 source[301;p源文件名字宰/ 获得客户端请求操作码:
INT8 dest【50】; 产操作后文件存 locakBuff_opcode=ntobs(Buff.opcode);
2010年3月 Electronic Component&DeviceApplications Mar.2010
{ INT8 bufer【SRV—PACKET_LENGTH】;
SOCK—DGRAMo卑| void gtpGetWRrq (char母type,char
初始化本地主机地址信息: file name口,char buff口)
万方数据
----------------------- Page 2-----------------------
第12卷第3期 电手元嚣件盔用 V01.12 No.3
512字节。则表示传输结束。如果数据包在传输 供其他模块读取。
过程中丢失.则发出方会在超时后重新传输最后 函数qiptlnputProgress(&glptKeeplnput)用于
一个未被确认的数据包。通信的双方都是数据的 接收客户的输入。再把客户输入的命令、文件
发出者与接收者,其中一方传输数据接收应答, 名、主机的ip地址保存到结构体中。其实现代码
另一方发出应答接收数据。 如下:
typedef struct input p存放最终输入
doi:lO.3969/j.issn.1563--4795.2010.03.018
简单文件传送协议ITFTP)的C语言实现
谢永悠
(西南交通大学信息科学与技术学院,四川 成都610031)
关键词:Tnm:server;client;超时重传
0引言 1 系统所要解决的问题
利用TFrP简单文件传输协议可以实现Ⅱ’rP 在唧文件的传输过程中,通常都要求有一
储地木, 打开本地文件:
pfile=fopen(path,”rb”);path为解析的路
径与文件名。
----------------------- Page 1-----------------------
第12卷第3期 +,,。 V01.12 No.3
20lo年3月 鬣钎雾喾 Mar.2010
器将根据客户端发过来的报文。解析出文件的路 方将无法接收到。如果错误包丢失,则将使用超
径和文件名,并且根据解析出来的文件名,开始 时机制。一般的错误主要是由三种情况引起:一
读文件并构造报文。然后再经过获取客户端发过 是不能满足请求;二是收到的数据包内容错误,
要步骤的结构代码如下: sendBuff.tu—block=htons(time);块号;
初始化Winsock库,注意要加上ws2—32.1ib库 mencpy(&(sendBuff.th—data),FileBuff,i);数
2.2 1'】51甲server模块
读本地文件:
本模块可调用构造报文模块,解析多个客户 Fread(Buff,sizeof(char),5 1 2,pfile);
字节传输。每个数据包一般都含有一块数据,服 输入模块可实现输个数据包以前.必须得到客户对上 错处理,负责接收客户的输入信息并解析命令。
一个数据包的确认。如果一个数据包的大小小于 并将接收到的命令存入结构体glptKeeplnput,以
命令的结构体木/
收稿日期:2009—10—21
删.eada.cn 2010.3电子元嚣件左用 55
INT8 ipaddr【20】;p目的主机牛/ recvfrom(sock,(clear木)&RecvBuff,5 12,0,
INT8 option【4】; ,幸操作类型木/ (struct sockaddr木)&Client,&alen);
server与Tn’P client之间的文件传输.包括多客 定的容错能力。大部分的错误都会导致连接中
户的下载和上传请求。 断。假如错误由一个错误的数据包引起.则这个
如果客户端发送的是下载请求,那么,服务 包将不被确认,也不会被重新发送,因此,另一
的请求,同时负责处理客户端请求,包括下载与 填充TFTP首部:
上传。检查包号是否正确,并实现容错功能,从 sendBuff.opcode=hton(3);操作码为3说明
而保证传输文件的正确性及可靠性。本模块的主 是数据包:
INT8 protoc【10];产协议木, 接收数据。定义数据块大小为512字节:
INT8mode[5】; 产传输类型宰/ INT32 alen=sizeof(Client);
*MYIp为ip地址;,Ic/ buff的前两位,如为1是读,如为2是写。
ServerAddr.sin_port=htons(69); / file_name D】=buff[i】;第三字节开始
SOCKETsListen=INVALID——SOCKET; sizeof(Client));
sListen=socket(AF_INET,SOCK DGRAM, 定义解析报文的函数.其中解析客户的请求
o);严这里用UDP协议,所以协议类型为 代码如下:
析报文。并将其写到指定的路径及文件中。
任何传输请求都来自一个读取或写入文件的 2系统实现
请求,这个请求也是连接请求。如果服务器批准
2.1输入模块
此请求,则服务器将打开连接,数据以定长512
则发送ACK给客户端以确认已经接受客户端的请 是源端口不正确,在这种情况下。指示错误的包
求,然后等待客户的DATA报文。客户端接收 会被发送到源机。事实上,Ⅱ耶协议的限制很
ACK后,就可开始发送数据报文。服务器开始解 多.这些都是为了实现起来比较方便而进行的。
来的端口号,把DATA报文发送给客户端;如果 而这种错误又不能由延时或重发解释;三是对需
客户端发送的是上传请求,那么,服务器端也必 要资源的访问丢失(如硬盘满)。
须解析出文件名及要保存的路径。若满足条件, 椰只在一种情况下不中断连接,这种情况
相关文档
最新文档