下载程序
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#define ERR_MSG(msg) do{\
fprintf(stderr, "line:%d: %s %s\n", __LINE__, __FILE__, __func__);\
perror(msg);\
}while(0)
#define IP "192.168.2.161"
#define PORT 69
typedef struct
{
uint16_t opcode ;
uint16_t block_num;
char Buf_data[512];
}Data_UnpackDataTyp;
Data_UnpackDataTyp Data_Unpack(char *addr)
{
Data_UnpackDataTyp Data;
short *ptr=(short *)addr;
Data.opcode=ntohs(*ptr);
ptr++;
Data.block_num=ntohs(*ptr);
ptr++;
char *ptr1=(char *)ptr;
for(int i=0;i<512;i++)
{
Data.Buf_data[i]=*ptr1;
ptr1++;
}
return Data;
}
int main(int argc, const char *argv[])
{
FILE *fp;
char *name="long.jpg";
char *mode="octet";
char WrR=1;
char Buf[516];
int Order_Data=0;
ssize_t Num_Data;
ssize_t Size_num=0;
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
socklen_t addrlen = sizeof(sin);
if((fp=fopen(name,"w+"))==NULL)
{
perror("create file");
return -1;
}
int sfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sfd < 0)
{
ERR_MSG("socket");
return -1;
}
printf("create socket success sfd=%d \n", sfd);
int Size_World=sprintf(Buf,"%c%c%s%c%s%c",0,WrR,name,0,mode,0);
if(sendto(sfd, Buf, Size_World, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0)
{
ERR_MSG("send");
return -1;
}
if((Num_Data=recvfrom(sfd, Buf, sizeof(Buf), 0, (struct sockaddr*)&sin, &addrlen)) < 0)
{
ERR_MSG("recvfrom");
return -1;
}
printf("客户端信息:[IP : PORT][%s : %d]\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
printf("数据包大小:%ld\n",Num_Data);
Data_UnpackDataTyp Data=Data_Unpack(Buf);
printf("opcode :%d num:%d \n",Data.opcode,Data.block_num);
if(Data.opcode==5)
ERR_MSG("download");
Order_Data++;
while(Num_Data>=516)
{
fwrite(Data.Buf_data,1,Num_Data-4,fp);
Size_World=sprintf(Buf,"%c%c%c%c",0,4,Buf[2],Buf[3]);
if(sendto(sfd, Buf, Size_World, 0, (struct sockaddr*)&sin, sizeof(sin))< 0)
{
ERR_MSG("send");
return -1;
}
if((Num_Data=recvfrom(sfd, Buf, sizeof(Buf), 0, (struct sockaddr*)&sin, &addrlen)) < 0)
{
ERR_MSG("recvfrom");
return -1;
}
Data=Data_Unpack(Buf);
if(Data.opcode==5)
ERR_MSG("download");
Size_num+=(Num_Data-4);
}
printf("send success!\n");
printf("Size:%ld\n",Size_num);
fclose(fp);
close(sfd);
return 0;
}