tftp_server
时间:2009-07-22 来源:sure_priterand
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int sockfd;
int fd,readLen=0;
struct sockaddr_in srvaddr;
unsigned short port = 69;
socklen_t addrlen = sizeof(srvaddr);
char *filename = argv[1];
char requ_buf[512] = "";
char back_buf[516] = "";
char send_buf[516] = "";
char file_buf[512] = "";
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(port);
// srvaddr.sin_addr.s_addr = inet_addr("192.168.220.99");
inet_pton(AF_INET,"192.168.220.99",&srvaddr.sin_addr.s_addr);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
{
perror("Invalid socket");
exit(1);
}
if((fd = open(filename, O_RDWR)) < 0 )
{
perror("File not found");
exit(1);
}
sprintf(requ_buf, "%c%c%s%c%s%c",0,2,filename,0,"octet",0);//构造请求报文,申请向服务器写数据
sendto(sockfd,requ_buf,512,0,(struct sockaddr*)&srvaddr, sizeof(struct sockaddr));//发送请求报文
recvfrom(sockfd, back_buf,516,0,(struct sockaddr*)&srvaddr,&addrlen); //保存 服务器返回的 回应 到back_buf中(返回ACK)
if(back_buf[1]==4)
{
int i=1;
while(1)
{
memset(file_buf,0,512);
memset(back_buf,0,50);
readLen=read(fd,file_buf,512);//读取要上传的文件fd中512K大小的内容到file_buf中
sprintf(send_buf,"%c%c%c%c%s%",0,3,0,(char)i,file_buf);//构造 要发送的数据包
sendto(sockfd,send_buf,516,0,(struct sockaddr *)&srvaddr,addrlen);//通过socked 把数据包发送到 服务器
if(readLen<512)//如果本此发送的数据包大小小于512K 则表示数据发送完毕 退出循环
break;
recvfrom(sockfd,back_buf,516,0,(struct sockaddr *)&srvaddr,&addrlen);//保存 服务器返回的 回应 到back_buf中
if(back_buf[3]==send_buf[3])//判断返回的块编号是否与发送的块编号相等
i++;//相等 则继续发送下一个大小小于512K 的数据包
else
printf("Error Info:%s\n",back_buf[5]);//服务器没有接到发送的数据包时 打印服务器返回的信息
}
close(sockfd);
close(fd);
}
return 0;
}
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int sockfd;
int fd,readLen=0;
struct sockaddr_in srvaddr;
unsigned short port = 69;
socklen_t addrlen = sizeof(srvaddr);
char *filename = argv[1];
char requ_buf[512] = "";
char back_buf[516] = "";
char send_buf[516] = "";
char file_buf[512] = "";
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(port);
// srvaddr.sin_addr.s_addr = inet_addr("192.168.220.99");
inet_pton(AF_INET,"192.168.220.99",&srvaddr.sin_addr.s_addr);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
{
perror("Invalid socket");
exit(1);
}
if((fd = open(filename, O_RDWR)) < 0 )
{
perror("File not found");
exit(1);
}
sprintf(requ_buf, "%c%c%s%c%s%c",0,2,filename,0,"octet",0);//构造请求报文,申请向服务器写数据
sendto(sockfd,requ_buf,512,0,(struct sockaddr*)&srvaddr, sizeof(struct sockaddr));//发送请求报文
recvfrom(sockfd, back_buf,516,0,(struct sockaddr*)&srvaddr,&addrlen); //保存 服务器返回的 回应 到back_buf中(返回ACK)
if(back_buf[1]==4)
{
int i=1;
while(1)
{
memset(file_buf,0,512);
memset(back_buf,0,50);
readLen=read(fd,file_buf,512);//读取要上传的文件fd中512K大小的内容到file_buf中
sprintf(send_buf,"%c%c%c%c%s%",0,3,0,(char)i,file_buf);//构造 要发送的数据包
sendto(sockfd,send_buf,516,0,(struct sockaddr *)&srvaddr,addrlen);//通过socked 把数据包发送到 服务器
if(readLen<512)//如果本此发送的数据包大小小于512K 则表示数据发送完毕 退出循环
break;
recvfrom(sockfd,back_buf,516,0,(struct sockaddr *)&srvaddr,&addrlen);//保存 服务器返回的 回应 到back_buf中
if(back_buf[3]==send_buf[3])//判断返回的块编号是否与发送的块编号相等
i++;//相等 则继续发送下一个大小小于512K 的数据包
else
printf("Error Info:%s\n",back_buf[5]);//服务器没有接到发送的数据包时 打印服务器返回的信息
}
close(sockfd);
close(fd);
}
return 0;
}
相关阅读 更多 +