#include<myhead.h>
#define ERR_(err) {perror(err);\
fprintf(stderr , "__%d__",__LINE__);}
#define IP "192.168.9.100"
#define PORT 69
int do_download(struct sockaddr_in sin,int ufd);
int main(int argc, const char *argv[])
{
int ufd=socket(AF_INET,SOCK_DGRAM,0);
if(ufd<0)
{
ERR_("socket");
return -1;
}
printf("udp=%d\n",ufd);
//服务器地址
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
while(1)
{
printf("---------------------\n");
printf("--------1.上传-------\n");
printf("--------2.下载-------\n");
printf("--------3.退出-------\n");
printf("---------------------\n");
printf("请输入-->>");
char c = getchar();
while(getchar()!=10);
switch(c)
{
case '1':
break;
case '2':
do_download(sin,ufd);
break;
case '3':
goto END;
break;
default:
printf("输入有误\n");
}
}
END:
//关闭文件描述符
close(ufd);
return 0;
}
int do_download(struct sockaddr_in sin,int ufd)
{
char name[20] = "";
printf("请输入文件名>>>\n");
scanf("%s",name);
while(getchar()!=10);
char buf[512]="";
//操作码2bytes
unsigned short *str=(unsigned short *)buf;
*str = htons(1);
//文件名nbytes
char *str1=(char *)(str+1);
strcpy(str1,name);
//0,1B
char *str2 = str1+strlen(name);
*str2=0;
//模式 nBytes
char *str3 = str2+1;
strcpy(str3,"octet");
int size=2+1+1+strlen(str1)+strlen(str3);
//存储服务器的临时端口及地址
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
//发送下载请求给服务器
if(sendto(ufd,buf,sizeof(buf),0,(struct sockaddr *)&sin,sizeof(sin))<0)
{
ERR_("sendto");
return -1;
}
printf("发送请求成功!\n");
//创建一个文件用来接受文件
int fdd=0;
fdd=open(name,O_WRONLY|O_APPEND|O_CREAT,0664);
if(fdd<0)
{
ERR_("open error");
return -1;
}
printf("fdd=%d\n",fdd);
printf("创建本地文件成功!\n");
char buf1[516] = "";
char opcode[2] = "";
char block[2] ="";
char packet[512] = "";
char ACK[4]="";
unsigned short *str4=(unsigned short *)ACK;
*str4 = htons(4);
str4+=1;
int nm=1;//进度值
int nm1=1;
char blocknum=0;
while(1)
{
bzero(buf1,sizeof(buf1));
//接收数据包
ssize_t len=recvfrom(ufd,buf1,sizeof(buf1),0,((struct sockaddr *)&cin),&addrlen);
if(len<0)
{
ERR_("recvfrom");
return -1;
}
printf("接收%ld\n",len);
printf("接收进度:--%d--\n",nm++);
short *p1 = (short *)buf1;
opcode[2] = *p1;//获取操作码
block[2] = *(p1+1);//获取块编号
// printf("块编码:%d\n",ntohs(block));
char *p2=(char *)(p1+2);
strcpy(packet,p2);//将数据包存入数组中
//写到创建的文件中
// if(strcmp(block,&blocknum)==0)//判断是否重发
// {
if(write(fdd,packet,strlen(packet))<0)
{
ERR_("write")
return -1;
}
printf("存储进度:--%d--\n",nm1++);
// }
//回复ACK
//制作回复信息
unsigned short *str4=(unsigned short *)block;
if(sendto(ufd,ACK,sizeof(ACK),0,(struct sockaddr *)&cin,sizeof(cin))<0)
{
ERR_("sendto");
return -1;
}
printf("回复ACK\n");
//判断数据是否小于
if(len<512)
{
break;
}
blocknum++;
}
close(fdd);
printf("下载成功!\n");
return 0;
}
#include<myhead.h>
#define ERR_(err) {perror(err);\
fprintf(stderr , "__%d__",__LINE__);}
#define IP "192.168.9.50"
#define PORT 3333
int main(int argc, const char *argv[])
{
int ufd=socket(AF_INET,SOCK_DGRAM,0);
if(ufd<0)
{
ERR_("socket");
return -1;
}
printf("udp=%d\n",ufd);
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
if(bind(ufd,(struct sockaddr *)&sin,sizeof(sin))<0)
{
ERR_("bind");
return -1;
}
printf("bind success\n");
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
char buf[128]="";
char buf1[128]="";
while(1)
{
bzero(buf,sizeof(buf));
if(recvfrom(ufd,buf,sizeof(buf),0,(struct sockaddr *)&cin, &addrlen)<0)
{
ERR_("recvfrom");
return -1;
}
printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
bzero(buf1,sizeof(buf1));
fgets(buf1,sizeof(buf1),stdin);
buf1[strlen(buf1)-1]=0;
if(sendto(ufd,buf1,sizeof(buf1),0,(struct sockaddr *)&cin,sizeof(cin))<0)
{
ERR_("sendto");
return -1;
}
printf("sendto success");
}
return 0;
}