#include "myhead.h"
int do_download(int cfd,struct sockaddr_in sin){
char buf[516]="";
char filename[40]="";
printf("请输入文件名:");
scanf("%s",filename);
getchar();
short *p1=(short*)buf;
*p1=htons(1);
char *p2=buf+2;
strcpy(p2,filename);
char *p4=p2+strlen(p2)+1;
strcpy(p4,"octet");
int size=4+strlen(p2)+strlen(p4);
if(sendto(cfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin))==-1){
perror("sendto error");
return -1;
}
printf("请求成功\n");
printf("%s\n",filename);
socklen_t socklen=sizeof(sin);
int N=0;
int fd=-1;
char wbuf[512]="";//定义一个数组用于写
socklen_t socklen1=sizeof(sin);
while(1){
bzero(buf,sizeof(buf));
N++;
//判断文件是否存在,不存在则创建
if(N==1){
if((fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1){
perror("open error");
}
}
//接收下载
int res=recvfrom(cfd,buf,sizeof(buf),\
0,(struct sockaddr*)&sin,&socklen1);
printf("res=%d\n",res-4);
if(3==buf[1]){
bzero(wbuf,sizeof(wbuf));
strncpy(wbuf,buf+4,512);//把buf的数据部分存到wbuf中
if(write(fd,wbuf,res-4)==-1){
perror("write error");
return -1;
}
}
//回ACK包
buf[1]=4;
if((sendto(cfd,buf,4,0,(struct sockaddr*)&sin,sizeof(sin)))==-1){
perror("send ack error");
return -1;
}
if(res<516){
break;
}
}
printf("下载完成\n");
}
int do_upload(int cfd,struct sockaddr_in sin){
char buf[516]="";
char filename[40]="";
printf("请输入文件名:");
scanf("%s",filename);
getchar();
//判断文件是否存在
int fd=-1;
if((fd=open(filename,O_RDONLY))==-1){
perror("no file");
return -1;
}
short *p1=(short*)buf;
*p1=htons(2);//改模式
char *p2=buf+2;
strcpy(p2,filename);
char *p4=p2+strlen(p2)+1;
strcpy(p4,"octet");
int size=4+strlen(p2)+strlen(p4);
//发送请求
if(sendto(cfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin))==-1){
perror("sendto error");
return -1;
}
printf("请求成功\n");
printf("%s\n",filename);
socklen_t socklen=sizeof(sin);
socklen_t socklen1=sizeof(sin);
int N=0;
char rbuf[512]="";//定义一个数组用于读
int res=0;
//循环
while(1){
bzero(buf,sizeof(buf));
//接收
recvfrom(cfd,buf,sizeof(buf),\
0,(struct sockaddr*)&sin,&socklen1);
//上传
if(4==buf[1]){
bzero(rbuf,sizeof(rbuf));
res=read(fd,buf+4,512);
printf("%d\n",res);
buf[1]=3;
*((short*)(buf+2))=htons(++N);
if((sendto(cfd,buf,res+4,0,(struct sockaddr*)&sin,sizeof(sin)))==-1){
perror("send ack error");
return -1;
}
}
if(res<512){
break;
}
}
}
int main(int argc, const char *argv[])
{
if(argc!=2){
printf("input error\n");
printf("usage:./a.out ip\n");
return -1;
}
int cfd=-1;
if( (cfd=socket(AF_INET,SOCK_DGRAM,0))==-1){
perror("socket error");
return -1;
}
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(69);
sin.sin_addr.s_addr=inet_addr(argv[1]);
int mune=-1;
while(1){
system("clear");
printf("\t\t=====1、下载======\n");
printf("\t\t=====2、上传======\n");
printf("\t\t=====0、退出======\n");
printf("请输入想实现的功能:");
scanf("%d",&mune);
getchar();
switch(mune){
case 1:
do_download(cfd,sin);
break;
case 2:
do_upload(cfd,sin);
break;
case 0:
goto END;
default:
printf("输入有误,请重新输入\n");
}
printf("输入任意键,按回车清空:");
while(getchar()!='\n');
}
END:
close(cfd);
return 0;
}
12.19
于 2023-12-19 21:19:48 首次发布