#include<head.h>
#define SER_PORT 69
#define SER_IP "192.168.122.96"
int download(int cfd,struct sockaddr_in sin)
{
//向服务器发送下载请求
char buf[512] = "";
//组装请求数据
short *p1 = (short *)buf;
*p1 = htons(1);
char *p2 = buf+2;
strcpy(p2, "1_armcli.c");
char *p3 = p2+strlen(p2)+1;
strcpy(p3, "octet");
int len = 4+strlen(p2) + strlen(p3); //要发送的长度
sendto(cfd,buf,len,0,(struct sockaddr*)&sin,sizeof(sin));
// 获取服务器的临时端口
struct sockaddr_in asin;
socklen_t addrlen = sizeof(asin);
int fd=-1;
if ((fd = open("./text.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664)) ==-1)
{
perror("open error");
return -1;
}
char abuf[516]="";
char cbuf[4]="";
while(1)
{
bzero(abuf,sizeof(abuf));
int res=recvfrom(cfd,abuf,sizeof(abuf),0,(struct sockaddr*)&sin,sizeof(sin));
int datatype=ntohs(*(short*)abuf);
int filebig=res-4;
printf("%d\n",filebig);
if(datatype==3)
{
write(fd,abuf+4,filebig);
//发送ACK
char x=abuf[2];
char y=abuf[3];
bzero(abuf,sizeof(abuf));
cbuf[0]=0x00;
cbuf[1]=0x04;
cbuf[2]=x;
cbuf[3]=y;
sendto(cfd,cbuf,4,0,(struct sockaddr*)&asin,&addrlen);
if(filebig<512)
{
printf("下载成功\n");
break;
}
}
}
return 0;
}
int up(int cfd,struct sockaddr_in sin)
{
//向服务器发送上传请求
char buf[516] = "";
//组装请求数据
short *p1 = (short *)buf;
*p1 = htons(2);
char *p2 = buf+2;
strcpy(p2, "z.c");
char *p3 = p2+strlen(p2)+1;
strcpy(p3, "octet");
int len = 4+strlen(p2) + strlen(p3); //要发送的长度
sendto(cfd,buf,len,0,(struct sockaddr*)&sin,sizeof(sin));
// 获取服务器的临时端口
struct sockaddr_in asin;
socklen_t addrlen = sizeof(asin);
bzero(buf,sizeof(buf));
recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&asin,&addrlen);
int fd=-1;
if((fd=open("./z.c",O_RDONLY))==-1)
{
perror("open error:");
return -1;
}
}
int main(int argc, const char *argv[])
{
//1、创建用于通信的套接字文件描述符
int cfd = socket(AF_INET, SOCK_DGRAM, 0);
if(cfd == -1)
{
perror("socket error");
return -1;
}
//2、绑定(可选)
//3、填充服务器的地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(SER_PORT);
sin.sin_addr.s_addr = inet_addr(SER_IP);
char menu;
while(1)
{
printf("\t\t=====1、下载=====\n");
printf("\t\t=====2、上传=====\n");
printf("\t\t=====0、退出=====\n");
printf("请输入功能选项:");
scanf("%c", &menu);
//吸收垃圾字符
while(getchar() != '\n');
switch(menu)
{
case '1':
{
download(cfd,sin);
}
break;
case '2':
{
up(cfd,sin);
}
break;
case '0':
exit(EXIT_SUCCESS);
default:
printf("您输入的功能有误请重新输入!!!\n");
}
printf("请输入任意键按回车清屏!!!\n");
//吸收垃圾字符
while(getchar() != '\n');
system("clear");
}
return 0;
}
day4 网络编程
最新推荐文章于 2024-09-16 15:03:26 发布