#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]="";
char arr[32]="";
/*
short* ptr1 = (short *)buf;
*ptr1 = htons(2);
char * ptr2 = buf+2;
strcpy(ptr2,argv[1]);
char *ptr3 = ptr2+strlen(ptr2);
char *ptr4 = ptr3+1;
strcpy(ptr4,"octet");
*/
int size=sprintf(arr,"%c%c%s%c%s%c",0,2,argv[1],0,"octet",0);
printf("arr_size = %d\n",size);
struct sockaddr_in cin;
socklen_t len;
if(sendto(sfd,arr,size,0,(struct sockaddr*)&Sersin,sizeof(Sersin))<0)
{
ERR_MSG("sendto");
return -1;
}
printf("发送成功\n");
int resw=0;
int count=0;
ssize_t res = 0;
const char *s=argv[1];
int fr=open(argv[1],O_RDONLY);
unsigned short i=0;
if(0>fr)
{
ERR_MSG("open");
return -1;
}
printf("open success\n");
*(short *)(buf+2) = htons(0);
while(1)
{
//if(htons((*(short *)(buf+2)))!=i) continue;
while(1)
{
//接收数据
bzero(buf,sizeof(buf));
if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&cin,&len)<0)
{
ERR_MSG("recvfrom");
return -1;
}
printf("[%d]:[%d] ",ntohs(*(short *)buf),ntohs(*(short *)(buf+2)));
fflush(stdout);
if((ntohs(*(unsigned short *)(buf+2)))==i)
break;
}
// 发送数据
if(buf[1]==4)
{
printf("i= %d %d\n",i,__LINE__);
bzero(buf,sizeof(buf));
sprintf(buf,"%c%c%c%c",0,3,0,++i);
res=read(fr,buf+4,512);
if(res<0)
{
ERR_MSG("read");
return -1;
}
if(res==0)
{
printf("上传完成\n");
break;
}
if(sendto(sfd,buf,res+4,0,(struct sockaddr *)&cin,len)<0)
{
ERR_MSG("sendto");
return -1;
}
}
else if(htons(*buf) == htons(5))
{
printf("download error:[%d] %s\n",*(short *)buf,buf+2);
return -1;
}
}
return 0;
}
网络编程 day5 (UDP上传updown)
于 2023-05-20 20:28:51 首次发布