#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<fcntl.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__",__LINE__);\
perror(msg);\
}while(0)
int main(int argc, const char *argv[])
{
if(argc<2)
{
fprintf(stderr,"请输入IP\n");
return -1;
}
//将获取到的端口字符串,转换成整形
/* int port=atoi(argv[2]);
if(port<1024||port>49151)
{
fprintf(stderr,"PORT %d input error! 1024-49151",port);
return -1;
}*/
//创建报式套接字
int sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
//填充服务器IP地址以及端口:
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(69);
sin.sin_addr.s_addr=inet_addr(argv[1]);
//绑定服务器地址信息结构体
/* if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)<0))
{
ERR_MSG("bind");
return -1;
}
printf("绑定成功");
struct sockaddr_in cin; //存储接收到的数据包来自哪里
socklen_t addrlen=sizeof(cin);
char buf[128]="";
while(1)
{
bzero(buf,sizeof(buf));
//接收
if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0)
{
ERR_MSG("recvfrom");
return -1;
}
printf("[%s : %d]:%s",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
//发送
}*/
//发送下载请求
char name[20]="";
printf("请输入文件名:");
scanf("%s",name);
char buf[128]="";
char* ptr=buf;
short int* pa=(short int*)ptr;
*pa=htons(1);
char* pb=ptr+2;
strcpy(pb,name);
char* pc=pb+strlen(pb);
*pc=0;
char* pd=pc+1;
strcpy(pd,"octet");
ssize_t size=2+strlen(pb)+1+strlen("octet")+1;
if(sendto(sfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin))<0)
{
ERR_MSG("sendto");
return -1;
}
printf("sendto success\n");
struct sockaddr_in rcv_addrmsg; //存储接收到的数据包来自哪里
socklen_t addlen=sizeof(rcv_addrmsg);
printf("fasf");
short ACK[4] = {0};
unsigned short code=0;
char text[516]={0};
unsigned short number=0;
int number1=0;
ssize_t res=0;
int fa=open("./new.png",O_RDWR|O_TRUNC|O_CREAT,0777);
if(fa<0)
{
ERR_MSG("open");
return -1;
}
printf("打开成功");
int num = 1;
while(1)
{
ssize_t res=0;
//bzero(buf,sizeof(buf));
bzero(text,sizeof(text));
res=recvfrom(sfd,text,sizeof(text),0,(struct sockaddr*)&rcv_addrmsg,&addlen);
if(res<0)
{
ERR_MSG("recvfrom");
return -1;
}
printf("%d %d\n",*(short*)text, *(short*)text+2);
code=htons(4);
number=htons(num++);
write(fa, text+4, res - 4);
if(res < 512)
break;
ACK[0] = code;
ACK[1] = number;
//*(unsigned char*)ACK=htons(4);
//*(unsigned short*)(ACK+2)=htons(number);
if(sendto(sfd,ACK,4,0,(struct sockaddr*)&rcv_addrmsg,sizeof(rcv_addrmsg))<0)
{
ERR_MSG("sendto");
return -1;
}
//printf("success");
}
//关闭套接字
close(sfd);
return 0;
}