file_save.h
#ifndef __FILE_H__ #define __FILE_H__ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <fcntl.h> #include <sys/types.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/select.h> #include <sys/time.h>
extern int file_save(int argc,char *argv[],unsigned short int port,int fd); #endif
fille.c
#include "file_save.h" int file_save(int argc,char *argv[],unsigned short int port,int socket_fd) { int fd; char *p; char rec_buf[550]; //接受数据报文缓存 int len; char ack_buf[4];//应答报文 unsigned long ip; int len_addr; struct sockaddr_in tftp_addr,rev_addr;//本地客户端信息 struct sockaddr tmp_addr;//存储服务端信息 bzero(&tftp_addr,sizeof(struct sockaddr_in)); bzero(rec_buf,550); bzero(ack_buf,4); inet_pton(AF_INET,argv[1],&ip); tftp_addr.sin_family=AF_INET; tftp_addr.sin_port=htons(port); tftp_addr.sin_addr.s_addr=htonl(ip); // ip
if( (fd=open(argv[2],O_CREAT|O_RDWR))<0 ) { perror("file open error"); exit(1); } bzero(&rev_addr,sizeof(struct sockaddr_in)); len_addr=sizeof(struct sockaddr_in); //while( ( len=recvfrom(socket_fd,rec_buf,512,0,(struct sockaddr *)&rev_addr,&len_addr) )==512 )
while( ( len=recvfrom(socket_fd,rec_buf,516,0,&tmp_addr,&len_addr) )==516 ) { write(fd,&rec_buf[4],512);//写入文件,除去报文额外信息 ack_buf[0]=0; ack_buf[1]=4;//应答报文操作码 ack_buf[2]=rec_buf[2]; ack_buf[3]=rec_buf[3];//获得报文编号 bzero(rec_buf,550); //sendto(socket_fd,ack_buf,4,0,(struct sockaddr *)&tftp_addr,len_addr); sendto(socket_fd,ack_buf,4,0,&tmp_addr,len_addr);//发送应答报文 } write(fd,&rec_buf[4],len-4);//写入文件,除去报文额外信息。 ack_buf[0]=0; ack_buf[1]=4;//应答报文操作码 ack_buf[2]=rec_buf[2]; ack_buf[3]=rec_buf[3];//获取报文编号 // sendto(socket_fd,ack_buf,4,0,(struct sockaddr *)&tftp_addr,len_addr); sendto(socket_fd,ack_buf,4,0,&tmp_addr,len_addr);//发送应答报文 close(fd); return 0; }
|