20240116(作业)基于UDP的TFTP文件传输

基于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;
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值