基于UDP的TFTP文件传输
/******** 基于UDP的TFTP文件传输 *********/
int main(int argc, const char *argv[])
{
//create socket
int sktfd=socket(AF_INET,SOCK_DGRAM,0);
if(sktfd==-1){
perror("socket error");
return -1;
}
//send massege
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(69);
sin.sin_addr.s_addr=inet_addr("192.168.10.114");
//send request
/*
char buf[516]="";
char *p=buf;
*((unsigned short *)buf)=htons(1);
strcpy(buf+2,"5.png");
// printf("strlen(buf+2)=%ld\n",strlen(buf+2));
buf[7]=0;
strcpy(buf+8,"octet");
buf[14]=0;
// printf("buf[0]=%d buf[1]=%d\n",buf[0],buf[1]);
// printf("buf=%s %s\n",buf+2,buf+8);
for(int i=0;i<14;i++){
if(buf[i]==0){printf("%c",'0');}
else{
printf("%c",*(buf+i));
}
}
puts("");
int len=0;
for(int i=2;i<516;i++){
if(buf[i]!=0) len++;
}
printf("len=%d\n",len);
*/
char buf[516] = "";
short *p1 = (short *)buf;
*p1 = htons(1);
char *p2 = buf+2;
strcpy(p2, "t.txt");
char *p3 = p2+strlen(p2)+1;
strcpy(p3, "octet");
int len = 4+strlen(p2) + strlen(p3); //要发送的长度
printf("buf=%#x %x\n",buf[0],buf[1]);
int sentCount=sendto(sktfd,buf,len,0,(struct sockaddr *)&sin,sizeof(sin));
printf("sentCount=%d\n",sentCount);
int destfd=open("t1.png",O_WRONLY|O_CREAT|O_TRUNC,0664);
printf("destfd=%d\n",destfd);
if(destfd==-1){
perror("open file error");
return -1;
}
unsigned short block=0;
while(1){
int res=recvfrom(sktfd,buf,sizeof(buf),0,NULL,NULL);
printf("res=%d\n",res);
if(res==516){
write(destfd,buf+4,res-4);
//block++;
//bzero(buf,sizeof(buf));
//*((unsigned short *)buf)=htons(4);
//*((unsigned short *)(buf+2))=htons(block);
//short *p4 = (short *)buf;
//*p4 = htons(4);
//short *p5 =(short *)(buf+2);
//*p5 = htons(block);
buf[1]=4;
printf("buf=%#x %x %x %x\n",buf[0],buf[1],buf[2],buf[3]);
int send=sendto(sktfd,buf,4,0,(struct sockaddr *)&sin,sizeof(sin));
printf("send=%d\n",send);
block++;
}else{
write(destfd,buf+4,res-4);
close(destfd);
break;
}
}
close(sktfd);
return 0;
}