基于UDP的TFTP文件传输
#include "head.h"
#define IP "192.168.1.8"
#define PORT 69
int _download(int sfd,struct sockaddr_in sin);
int _upload(int sfd,struct sockaddr_in sin);
int main(int argc, const char *argv[])
{
int sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd<0)
{
_errmsg("socket");
return -1;
}
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);
sin.sin_addr.s_addr=inet_addr(IP);
while(1)
{
printf("---------------------------\n");
printf("-----------1.下载----------\n");
printf("-----------2.上传----------\n");
printf("-----------3.退出----------\n");
printf("---------------------------\n");
int xz;
printf("请输入>>>");
scanf("%d",&xz);
switch(xz)
{
case 1:
_download(sfd,sin);
break;
case 2:
_upload(sfd,sin);
break;
case 3:
goto END;
default:
printf("输入错误,请重新输入\n");
}
}
END:
close(sfd);
return 0;
}
int _download(int sfd,struct sockaddr_in sin)
{
char buf[512];
char wenjianming[20];
printf("请输入文件名>>>");
scanf("%s",wenjianming);
while(getchar()!=10);
short* ptr1=(short*)buf;
*ptr1=htons(1);
char* ptr2=buf+2;
strcpy(ptr2,wenjianming);
char* ptr4=ptr2+strlen(ptr2)+1;
strcpy(ptr4,"octet");
int size=2+strlen(ptr2)+1+strlen(ptr4)+1;
if(sendto(sfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin))<0)
{
_errmsg("sendto");
return -1;
}
printf("请求已发送\n");
struct sockaddr_in cin;
socklen_t len=sizeof(cin);
char sjb[516];
short* btr1=(short*)sjb;
ssize_t res;
short* btr2=btr1+1;
char ACK[4];
short* atr1=(short*)ACK;
*atr1=htons(4);
short* atr2=atr1+1;
int fd= open("./xiazaiwenjian",O_WRONLY|O_CREAT|O_APPEND|O_TRUNC,0664);
while(1)
{
if((res=recvfrom(sfd,sjb,sizeof(sjb),0,(struct sockaddr*)&cin,&len))<0)
{
_errmsg("recvfrom");
return -1;
}
*atr2=*btr2;
printf("%ld\n",res);
if(fd<0)
{
_errmsg("open");
return -1;
}
if(write(fd,&sjb[4],res-4)<0)
{
_errmsg("write");
return -1;
}
if(sendto(sfd,ACK,sizeof(ACK),0,(struct sockaddr*)&cin,sizeof(cin))<0)
{
_errmsg("sendto");
return -1;
}
if(res<516)
{
printf("下载完成\n");
break;
}
}
return 0;
}
int _upload(int sfd,struct sockaddr_in sin)
{
int fd=open("./123.png",O_RDONLY);
if(fd<0)
{
_errmsg("open");
return -1;
}
char buf[512];
char wenjianming[20];
printf("请输入文件名>>>");
scanf("%s",wenjianming);
while(getchar()!=10);
short* ptr1=(short*)buf;
*ptr1=htons(2);
char* ptr2=buf+2;
strcpy(ptr2,wenjianming);
char* ptr4=ptr2+strlen(ptr2)+1;
strcpy(ptr4,"octet");
int size=2+strlen(ptr2)+1+strlen(ptr4)+1;
if(sendto(sfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin))<0)
{
_errmsg("sendto");
return -1;
}
printf("上传请求已发送\n");
char sjb[516];
short* btr1=(short*)sjb;
*btr1=htons(3);
short* btr2=btr1+1;
int i=0;
ssize_t res;
struct sockaddr_in cin;
socklen_t len=sizeof(cin);
char ACK[4];
short* atr1=(short*)ACK;
short* atr2=atr1+1;
while(1)
{
if(recvfrom(sfd,ACK,sizeof(ACK),0,(struct sockaddr*)&cin,&len)<0)
{
_errmsg("recvfrom");
return -1;
}
printf("%d\n",__LINE__);
*btr2=htons(i++);
if((res=read(fd,&sjb[4],512))<0)
{
_errmsg("read");
return -1;
}
printf("%ld %d\n",res,i);
if(res==0)
{
printf("上传完成\n");
return -1;
}
if(sendto(sfd,sjb,res+4,0,(struct sockaddr*)&cin,len)<0)
{
_errmsg("sendto");
return -1;
}
}
}
运行结果
下载5.png文件
上传123.png文件