代码
#include<myhead.h>
#define SER_PORT 69 //指定要将数据发给谁,填谁的端口号
#define SER_IP "10.102.136.255" //指定要将数据发给谁,填谁的IP
int do_download();
int do_upload();
int main(int argc, const char *argv[])
{
//创建报式套接字 socket
int cfd = socket(AF_INET, SOCK_DGRAM, 0);
if(cfd < 0)
{
ERR_MSG("socket");
return -1;
}
printf("socket create success cfd=%d\n", cfd);
struct sockaddr_in cin;/*}}}*/
cin.sin_family = AF_INET;
cin.sin_port = htons(SER_PORT);
cin.sin_addr.s_addr = inet_addr(SER_IP);
char choose = 0;
int flag = 0;
while(1)
{
printf("---1、下载---\n");
printf("---2、上传---\n");
printf("---3、退出---\n");
printf("请输入>>");
scanf("%s",&choose);
while(getchar() != 10);
switch(choose)
{
case '1':
do_download(cfd,cin);
break;
case '2':
//do_upload
break;
case '3':
flag = 1;
break;
defalut:
printf("输入错误请重新输入!\n");
}
if(flag == 1)
{
break;
}
}
//关闭套接字
close(cfd);
return 0;
}
int do_download(int cfd,struct sockaddr_in sin)
{
int fd = -1;
ssize_t ret;
char buf[516] = "";
char filename[20] = "";
printf("请输入要下载的文件名>>");
scanf("%s",filename);
if((fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0664)) == -1)
{
ERR_MSG("open");
return -1;
}
//吸收垃圾字符
while(getchar() != 10);
//固定两个字节
unsigned short *ptr1 = (unsigned short *)buf;
*ptr1 = htons(1);
//固定一个字节
char *ptr2 = buf+2;
strcpy(ptr2,filename);
//固定一个字节
char *ptr4 = ptr2+strlen(filename)+1;/*}}}*/
strcpy(ptr4,"octet");
//整个字符数组的实际大小
int size = 2+strlen(ptr2)+1+strlen(ptr4)+1;
//发送请求
if(sendto(cfd,buf,size,0,(struct sockaddr *)&sin,sizeof(sin)) < 0)
{
ERR_MSG("sendto");
return -1;
}
while(1)
{
//数组清零
bzero(buf,sizeof(buf));
socklen_t addrlen = sizeof(buf);
//读取数据包
if((ret = recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr *)&sin, &addrlen)) < 0)
{
ERR_MSG("recvfrom");
return -1;
}
if(buf[1] == 5)
{
printf("接受的信息包错误!\n");
close(fd);
break;
}
if(write(fd,buf+4,ret-4) == -1)
{
ERR_MSG("write");
return -1;
}
int size = sprintf(buf,"%c%c%c%c", 0, 4, buf[2],buf[3]); //发送ACK
if(sendto(cfd, buf, 4, 0, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
ERR_MSG("sendto");
return -1;
}
if((ret-4) < 512)
{
printf("下载完成!\n");
break;
}
}
close(fd);
return 0;
}
int do_upload()
{
return 0;
}
运行结果