#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <head.h>
#define PORT 6666
#define IP "127.0.0.1"
#define IDname "5.png" //nbytes文件名
int main(int argc, const char *argv[])
{
//创建报式套接字
int sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
printf("sfd=%d\n",sfd);
//绑定服务器的地址信息结构体到套接字上
//不绑定随机
//填充服务器自身的地址信息结构体,给sendto使用
//要发给谁,就填充谁的地址
struct sockaddr_in sin;
socklen_t addrlen =sizeof(sin);
sin.sin_family =AF_INET; //必须填AF_INET
sin.sin_port =htons(PORT); //端口号:1024~49151
sin.sin_addr.s_addr =inet_addr(IP); //本机IP:ifconfig
//创建读写请求
char buf[517]="";
char* ptr1=buf;
short int* ptr2=(short int*)buf;
*ptr2=htons(1);
char* ptr3=(char*)ptr2+2;
strcpy(ptr3,IDname);
char* ptr4=ptr3+strlen(ptr3)+1;;
strcpy(ptr4,"octet");
ssize_t size=2+strlen(ptr3)+1+strlen("octet")+1;
ssize_t res=0;
if(sendto(sfd,buf,size,0,(struct sockaddr*)&sin,addrlen)<0)
{
ERR_MSG("sendto") ;
return -1;
}
int fd=open("./3.png",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fd<0)
{
ERR_MSG("open");
return -1;
}
char* ptr5=(char*)ptr2+4;
int i=1;
while(i)
{
//接收数据
res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen);
//res=recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL);
if(res<0)
{
ERR_MSG("recvfrom");
return -1;
}
// printf("[%s : %d] : %s\n",inet_ntoa(rcvaddr.sin_addr),ntohs(rcvaddr.sin_port),buf);
write(fd,ptr5,512);
*ptr2=htons(4);
size_t size_ACK=4;
//发送数据
if(sendto(sfd,buf,size_ACK,0,(struct sockaddr*)&sin, addrlen)<0)
{
ERR_MSG("sendto");
return -1;
}
if(res<516)
{
i=0;
}
}
//关闭文件描述符
close(sfd);
return 0;
}
UDP ,tftp的下载
最新推荐文章于 2024-06-13 21:57:53 发布