#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<strings.h>
#include<unistd.h>
#include<errno.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define NUM 10
#define ERR_MSG(msg) do{\
printf("line: %d\n",__LINE__);\
perror(msg);\
}while(0)
#define PORT 69 //端口号的网络字节序 1024~49151
#define SerIP "192.168.1.15" //ifconfig查看本机IP (ipv4)
int main(int argc, const char *argv[])
{
//创建报式套接字
int sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
//填充服务器自身的地址信息结构体
//真实的地址信息结构体根据地址族制定AF_INET ; man 7 ip
struct sockaddr_in Sersin;
Sersin.sin_family = AF_INET; //必须填充AF_INET
Sersin.sin_port = htons(PORT); //端口号的网络字节序 1024~49151
Sersin.sin_addr.s_addr = inet_addr(SerIP); //ifconfig查看本机IP
//将SerIP地址和端口号绑定到制定的套接字文件描述符上
/* if(bind(sfd,(struct sockaddr *)&Sersin, sizeof(Sersin)) < 0)
{
ERR_MSG("bind");
return -1;
}
printf("bind success __%d__\n",__LINE__);
struct sockaddr_in Usrsin;
Usrsin.sin_family = AF_INET; //必须填充AF_INET
Usrsin.sin_port = htons(6666); //端口号的网络字节序 1024~49151
Usrsin.sin_addr.s_addr = inet_addr(UsrIP); //ifconfig查看本机IP
if(connect(sfd,(struct sockaddr *)&Usrsin,sizeof(Usrsin))<0)
{
ERR_MSG("connect");
return -1;
}
printf("connect success\n");
*
*/
char buf[516]="";
/*
short* ptr1 = (short *)buf;
*ptr1 = htons(1);
char * ptr2 = buf+2;
strcpy(ptr2,argv[1]);
char *ptr3 = ptr2+strlen(ptr2);
char *ptr4 = ptr3+1;
strcpy(ptr4,"octet");
*/
int size = sprintf(buf,"%c%c%s%c%s%c",0,1,argv[1],0,"octet",0);
struct sockaddr_in cin;
socklen_t len=sizeof(cin);
if(sendto(sfd,buf,size,0,(struct sockaddr*)&Sersin,sizeof(Sersin))<0)
{
ERR_MSG("sendto");
return -1;
}
printf("发送成功\n");
const char *s=argv[1];
umask(0);
int fw=open(s,O_WRONLY | O_CREAT | O_TRUNC,0744);
if(0>fw)
{
ERR_MSG("open");
return -1;
}
int resw=0;
ssize_t res = 0;
unsigned short num=1;
while(1)
{
//接收数据
while(1)
{
bzero(buf,sizeof(buf));
res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&Sersin,&len);
if(res<0)
{
ERR_MSG("recvfrom");
return -1;
}
printf("操作符:%d 块编号:%d [%d]:\t%ld\tOK\n",\
ntohs(*(short*)buf),ntohs(*(short*)(buf+2)),num,res);
if((ntohs(*(unsigned short *)(buf+2)))==num)
break;
}
//判断数据
char buf_flg[128]="";
short* ptr1_flg = (short *)buf;
if(htons(*ptr1_flg) == htons(5))
{
char *ptr2_flg = buf+2;
char *ptr3_flg = ptr2_flg+2;
printf("download error:%d %s\n",*(short *)ptr2_flg,ptr3_flg);
return -1;
}
//拷贝数据
resw=write(fw,buf+4,res-4);
if(resw<0)
{
ERR_MSG("write");
return -1;
}
num++;
//发送数据
char ToSend[4]="";
sprintf(ToSend,"%c%c%c%c",0,4,buf[2],buf[3]);
if(res<516)
{
printf("拷贝完成\n");
break;
}
if(sendto(sfd,ToSend,4,0,(struct sockaddr *)&Sersin,sizeof(Sersin))<0)
{
ERR_MSG("sendto");
return -1;
}
}
return 0;
}
网络编程 day3 (UDP下载download)
于 2023-05-17 19:33:09 首次发布