#include <my_h.h>
int download(int sfd,struct sockaddr_in sin);
#define RES_IP "192.168.125.27"
#define RES_PORT 69
#define NAME "p.jpg"
int main(int argc, const char *argv[])
{
//创建套接字
int sfd=socket(AF_INET,SOCK_DGRAM,0);
printf("套接字创建成功\n");
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(RES_PORT);
sin.sin_addr.s_addr=inet_addr(RES_IP);
char choose;
while(1)
{
printf("---------------------------\n");
printf("----------1.下载-----------\n");
printf("----------2.上传-----------\n");
printf("----------3.退出-----------\n");
printf("---------------------------\n");
printf("---->");
scanf(" %c",&choose);
switch(choose)
{
case '1':
download(sfd,sin);
break;
case '2':
break;
case '3':
goto END;
}
}
END:
close(sfd);
return 0;
}
int download(int sfd,struct sockaddr_in sin)
{
//编辑下载的协议
char s[20];
printf("输入想要下载的文件名\n");
scanf("%s",s);
while(getchar()!=10);
char buf[128];
unsigned short *p1=(unsigned short *)buf;
*p1=htons(1);
char *p2=buf+2;
strcpy(p2,s);
char *p3=p2+strlen(s)+1;
strcpy(p3,"octet");
size_t size=2+strlen(p2)+1+strlen(p3)+1;
//发送下载的协议
sendto(sfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin));
printf("发送下载请求成功\n");
//打开文件存储服务器传来的数据包
int fd=open(NAME,O_CREAT|O_WRONLY|O_TRUNC,0664);
char sb[516];
char ACK[4];
//struct sockaddr_in newsin;
socklen_t addrlen=sizeof(sin);
while(1)
{
//接收数据包
// res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&newsin,&addrlen);
// if(res<0)
// {
// perror("ewcvfrom");
// return -1;
// }
//清空
bzero(sb, sizeof(buf)); //接收服务器发送过来的数据包
bzero(ACK, sizeof(ACK)); //四字节大小的ACK包
int rec;
//接收服务器发送过来的数据包
if((rec = recvfrom(sfd, sb, sizeof(sb),0,(struct sockaddr*)&sin, &addrlen)) < 0)
{
perror("recvfrom");
return -1;
}
ssize_t res = read(fd, sb+4, 512);
write(fd, sb+4, rec-4);
//组ACK包
//回复ACK
char *p = ACK;
short int *ack = (short int*)p;
*ack = htons(4);
ACK[2] = sb[2];
ACK[3] = sb[3];
if(sendto(sfd, ACK, 4, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0)
{
perror("sendto");
return -1;
}
//判断数据是否小于512,若小于512则结束下载
if(rec<516)
{
printf("数据包下载完成\n");
break;
}
}
close(fd);
return 0;
}
tftp上传下载
最新推荐文章于 2024-08-08 15:12:59 发布