客户端代码
#include<myhead.h>
#define SER_PORT 69
#define SER_IP "192.168.125.91"
void download(int cfd,struct sockaddr_in sin)
{
char filename[128];
printf("Enter filename to download:");
scanf("%s",filename);
int fd; //创建文件描述符,位后续操作做准备
int num=0; //块编号
int flag=0; //标志位判断文件有没有
ssize_t bytes=0; //接收数据包的大小
char text[1024]; //创建一个容器,存放接受的数据
int addr_len=sizeof(struct sockaddr_in);
int text_len=sprintf(text,"%c%c%s%c%s%c",0,1,filename,0,"octet",0);
sendto(cfd,text,text_len,0,(struct sockaddr*)&sin,sizeof(sin)); //发送下载请求
while (1)
{
bytes=recvfrom(cfd,text,sizeof(text),0,(struct sockaddr*)&sin,&addr_len); //接受第一个数据包
printf("Recived data from server...\n");
if(text[1]==3) //判断数据包是否正确
{
//若没有文件则创建文件
if(flag==0)
{
fd=open(filename,O_RDWR|O_CREAT|O_TRUNC);
flag=1;
}
//正常接受数据
if(((ntohs(*(unsigned short *)(text+2))) == num+1 ) && (bytes == 516))
{
num=ntohs(*(unsigned short *)(text+2));
write(fd,text+4,bytes-4);
text[1]=4;
sendto(cfd,text,4,0,(struct sockaddr*)&sin,addr_len);
}
//判断数据包字节数少于516,接受最后一个数据包并结束
else if(((ntohs(*(unsigned short *)(text+2))) == num+1 ) && (bytes < 516))
{
write(fd,text+4,bytes-4);
text[1]=4;
sendto(cfd,text,4,0,(struct sockaddr*)&sin,addr_len);
printf("Complete!!!\n");
return ;
}
}
}
}
int main(int argc, char const *argv[])
{
int cfd =1;
cfd=socket(AF_INET,SOCK_DGRAM,0); //创建通信套接字
if(cfd==-1)
{
perror("socket error");
return -1;
}
printf("cfd=%d\n",cfd);
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(SER_PORT);
sin.sin_addr.s_addr=inet_addr(SER_IP);
download(cfd,sin); //调用下载函数
close(cfd);
return 0;
}
运行结果