一、基于udp的tftp模块传输
//客户端
//下载
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<sys/stat.h>
#include<fcntl.h>
#define ERR_MSG(msg) do{\
printf("line:%d\n",__LINE__);\
perror(msg);\
}while(0)
#define SER_PORT 69//端口号//端口号网络字节序 1024-49151
#define SER_IP "192.168.9.124"
int main(int argc, const char *argv[])
{
//创建套接字
int sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
printf("socket create successsfd=%d\n",sfd);
//服务器的ip信息
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 buf[516]="";
short *ptr1=(short*)buf;//操作码下载
*ptr1 = htons(1);
char *ptr2=buf+2; //要下载的文件名
printf("请输入文件名>>>>>>");
char name[128]="";
scanf("%s",name);
strcpy(ptr2,name);
char *ptr3=ptr2+strlen(ptr2);
*ptr3=0;
char *ptr4=ptr3+1; //模式
strcpy(ptr4,"octet");
int buflen=2+strlen(ptr2)+1+strlen(ptr4)+1;
if(sendto(sfd,buf,buflen,0,(struct sockaddr*)&sin,sizeof(sin))<0)
{
ERR_MSG("sendto");
return -1;
}
//收发数据包
struct sockaddr_in recvaddr;
socklen_t addrlen =sizeof(recvaddr);
short opdata =0;
short block =0;
ssize_t res=0;
int fd=open(name,O_WRONLY|O_CREAT|O_TRUNC,0644);
if(fd<0)
{
ERR_MSG("open");
return -1;
}
while(1)
{
bzero(buf,strlen(buf));
res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&recvaddr,&addrlen);
if(res<0)
{
ERR_MSG("recvfrom");
return -1;
}
opdata=ntohs(*(short*)buf);
if(opdata==3)
{
write(fd,buf+4,res-4);
*(short*)buf = htons(4);
sendto(sfd,buf,4,0,(struct sockaddr*)&recvaddr,addrlen);
if(res<516)
{
break;
}
}
else if(opdata==5)
{
printf("接收失败error%hd:%s\n",ntohs(*(short*)(buf+2)),buf+4);
break;
}
}
//关闭套接字
close(sfd);
close(fd);
return 0;
}
![](https://img-blog.csdnimg.cn/a7848adfae3c46e3bade52ae584b7e11.png)