#include <myhead.h>
#define SER_PORT 69
#define SER_IP "192.168.125.85"
int do_download(int cfd, struct sockaddr_in sin);
int do_upload(int cfd, struct sockaddr_in sin);
void main()
{
//socket(套接字)
int cfd=socket(AF_INET,SOCK_DGRAM,0);
if(cfd<0)
{
ERR_MSG("socket");
return -1;
}
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port =htons(SER_PORT);
sin.sin_addr.s_addr = inet_addr(SER_IP);
//bind
char c=0;
while(1){
printf("----------1.下载----------\n");
printf("----------2.上传----------\n");
printf("----------3.退出----------\n");
printf("轻输入>>> ");
c=getchar();
while(getchar()!='\n');
switch(c){
case '1':
do_download(cfd,sin);
break;
case '2':
do_upload(cfd,sin);
break;
case '3':
goto END;
}
}
END:
//close
close(cfd);
return 0;
}
int do_download(int cfd,struct sockaddr_in sin)
{ //组下载协议
printf("请输入要下载的文件名>>> ");
char name[20];
scanf("%s",name);
getchar();
char buf[516]="";
unsigned short *p1 =(unsigned short*)buf;
*p1 =htons(1); //操作码
char *p2 =buf+2;
strcpy(p2,name);//文件名
char *p3 =p2+strlen(name)+1;
strcpy(p3,"octet");//协议
int size =2+strlen(p2)+1+strlen(p3)+1;
//发送下载协议给服务器
if(sendto(cfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin))<0)
{
ERR_MSG("sendto");
return -1;
}
printf("sendto download success\n");
socklen_t len=sizeof(sin);
int fd=open("./1.txt",O_CREAT|O_TRUNC|O_RDWR,0664);
close(fd);
while(1){
bzero(buf,sizeof(buf));
//接收数据包
ssize_t res =recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&len);
if(res<0)
{
ERR_MSG("recvfrom");
return -1;
}
char *data=buf+4;
int fd =open("./1.txt",O_RDWR|O_APPEND);
write(fd,data,res-4);
//组ACK包
unsigned short *m1=(unsigned short*)buf;
*m1=htons(4);
unsigned short *m2=m1+1;
*m2=*(m1+1);
//回复ACK
if(sendto(cfd,buf,4,0,(struct sockaddr*)&sin,sizeof(sin))<0)
{
ERR_MSG("sendto");
return -1;
}
//判断数据是否小于512,若小于512则结束下载
if((res-4)<512){
close(fd);
printf("下载结束\n");
break;
}
}
return 0;
}
int do_upload(int cfd,struct sockaddr_in sin)
{//组上传协议
printf("请输入要上传的文件名>>> ");
char name[20];
scanf("%s",name);
getchar();
char buf[516]="";
unsigned short *p1 =(unsigned short*)buf;
*p1 =htons(2); //操作码
char *p2 =buf+2;
strcpy(p2,name);//文件名
char *p3 =p2+strlen(name)+1;
strcpy(p3,"octet");//协议
int size =2+strlen(p2)+1+strlen(p3)+1;
//发送上传协议给服务器
if(sendto(cfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin))<0)
{
ERR_MSG("sendto");
return -1;
}
printf("sendto upload success\n");
struct sockaddr_in addr;
socklen_t len=sizeof(addr);
ssize_t res=0;
unsigned short num =0;
int fd=open("./1.txt",O_RDWR);
//组数据包
while(1){
bzero(buf,sizeof(buf));
if(recvfrom(cfd,buf,4,0,(struct sockaddr*)&addr,&len)<0)//接ACK
{
ERR_MSG("recvfrom");
return -1;
}
if(htons(4)==*(unsigned short*)buf)
{
bzero(buf,sizeof(buf));
*(unsigned short*)buf=htons(3);
num++;
*(unsigned short*)(buf+2) = htons(num);
res=read(fd,buf+4,512);
if(res<0)
{
ERR_MSG("read");
return -1;
}
if(res==0)
{
printf("文件传输完毕\n");
close(fd);
break;
}
if(sendto(cfd,buf,(4+res),0,(struct sockaddr*)&addr,len)<0)
{
ERR_MSG("sendto");
return -1;
}
}
else if(htons(5)==*(unsigned short*)buf)
{
printf("------ERROR:%s------\n",buf+4);
break;
}
}
return 0;
}