#include <head.h>
#include <sys/types.h>
#define POT 69
#define IP "192.168.124.24"
int down(int sfd,struct sockaddr_in sin);
int main(int argc, const char *argv[])
{
//创建报式套接字
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if(sfd < 0)
{
ERR_MSG("socket");
return -1;
}
printf("套接字创建成功 __%d__\n",__LINE__);
//定义填充地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET; //必须为AF_INET
sin.sin_port = htons(POT); //端口号
sin.sin_addr.s_addr = inet_addr(IP); // 本机IP
char s;
while(1)
{
printf("---------------------\n");
printf("-------1.下载--------\n");
printf("-------2.上传--------\n");
printf("-------3.退出--------\n");
printf("---------------------\n");
printf("请输入:");
s = getchar();
while(getchar()!='\n');
switch(s){
case '1':
//下载
down(sfd,sin);
break;
case '2':
//上传
// insert();
break;
case '3':
goto END;
default:
printf("输入错误,重新输入\n");
}
}
END:
//关闭套接字
close(sfd);
return 0;
}
int down(int sfd,struct sockaddr_in sin)
{
char buf[516]; // 数据包
char arr[4]; //应答包
char fname[20];
printf("请输入文件名:");
scanf("%s",fname);
while(getchar()!= 10);
//定义保存数据的文件
int fd = open("./1.png",O_WRONLY | O_CREAT, 0664);
if(fd < 0)
{
ERR_MSG("open");
return -1;
}
//组下载请求包
short*ptr1 = (short*)buf;
*ptr1 = htons(1);
char *ptr2 = buf + 2;
strcpy(ptr2,fname);
char*ptr4 = ptr2 + strlen(ptr2) + 1;
strcpy(ptr4,"octet");
int size = 2 + strlen(ptr2) + 1 + strlen(ptr4) + 1;
//定义存数据包的发送地址
struct sockaddr_in cin;
socklen_t len=sizeof(cin);
//发送下载请求
if(sendto(sfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin)) < 0)
{
ERR_MSG("sendto");
return -1;
}
printf("发送下载请求成功\n");
ssize_t res =0;
//接受服务器传回来的数据包
bzero(buf,sizeof(buf));//清空
if(recvfrom(sfd,buf,sizeof(buf)-1,0,(struct sockaddr*)&cin,&len) < 0)
{
ERR_MSG("recvfrom");
return -1;
}
printf("%s",buf);
printf("__%d__\n",__LINE__);
short s = *(short*)buf + 1; //另存块编号
while(res != -1)
{
res = write(fd,buf+4,1);
}
printf("__%d__\n",__LINE__);
printf("%s",buf);
//组应答包
short *a1 = (short*)arr; //操作码
*a1 = htons(4);
short *a2 = (short*)arr + 1;
*a2 = htons(s); // 从返回的数据包中拿到块编号
//发送应答包到服务器
if(sendto(sfd,arr,4,0,(struct sockaddr*)&sin,sizeof(sin)) < 0)
{
ERR_MSG("sendto");
return -1;
}
// }
close(fd);//关闭文件
return 0;
}
网络编程第二天作业
最新推荐文章于 2024-07-19 17:35:15 发布