TFTP协议实现
来源:互联网 发布:江苏省服务贸易数据 编辑:程序博客网 时间:2024/04/26 06:02
int main(int argc,char **argv)
{
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
char recv_buf[516] = {};
char send_buf[516] = {};
char recv_cmd[4] = {};
int byte;
int n = 0;
int pid,fd;
server_sockfd = socket(AF_INET,SOCK_DGRAM,0);
bzero(&server_address,sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr("192.168.220.59");
//我的PC机IP地址
server_address.sin_port = htons(69);
server_len = sizeof(server_address);
bind(server_sockfd,(struct sockaddr*)&server_address,server_len);
if((byte = recvfrom(server_sockfd,recv_buf,516,0,(structsockaddr *)&client_address,sizeof(struct sockaddr))) == -1)
{
perror("recvfrom");
exit(0);
}
//创建一个进程来分析收到的报文信息
if((pid = fork()) == 0)
{
if(recv_buf[1] == 1) //为下载文件请求
{
printf("this is a read request:\n");
if((fd = open(recv_buf[2],O_RDONLY)) < 0)
{
perror("open");
exit(0);
}
while(1)
{
recvfrom(server_sockfd,recv_cmd,4,0,(struct sockaddr *)&client_address,sizeof(struct sockaddr));
read(fd,send_buf+4,sizeof(send_buf+4));
//将文件内容读入数据区
send_buf[1] = 3;
//构造报文
if((byte = sendto(server_sockfd,send_buf,516,0,(struct sockaddr *)&client_address,sizeof(struct sockaddr))) == 516)
{
sendto(server_sockfd,send_buf,4,0,(struct sockaddr *)&client_address,sizeof(struct sockaddr));
send_buf[3]++;
}
//TFTP每次发送512个字节,附带四个字节的报文信息,小于516时就代表文件传输完毕
else
exit(0);
}
}
if (recv_buf[1] == 2) //为上传文件请求
{
printf("this is a write request:\n");
if((fd = open(recv_buf[2],O_RDWR|O_CREAT)) < 0)
{
perror("open");
exit(0);
}
while(1)
{
recvfrom(server_sockfd,recv_cmd,4,0,(struct sockaddr *)&client_address,sizeof(struct sockaddr));
recvfrom(server_sockfd,recv_buf,512,0,(struct sockaddr *)&client_address,sizeof(struct sockaddr));
write(fd,send_buf+4,sizeof(send_buf+4));
send_buf[1] = 3;
if((byte = sendto(server_sockfd,send_buf,516,0,(struct sockaddr *)&client_address,sizeof(struct sockaddr))) == 516)
{
sendto(server_sockfd,send_buf,4,0,(struct sockaddr *)&client_address,sizeof(struct sockaddr));
send_buf[3]++;
}
else
exit(0);
}
}
close(fd);
}
else
return 0;
}
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <fcntl.h>
int main(int argc,char **argv)
{
int sockfd;
struct sockaddr_in server;
char read_cmd[100] = {};
char buf[516]="";
char *str;
int addrlen = sizeof(server);
int fd,rew,recv,read_num,send_num;
int n = 0,num;
char filename[100] = {};
if(argc == 1)
{
printf("ERROR:please input a filename:\n");
exit(0);
}
else if(argc == 2)
{
strcpy(filename,argv[1]);
}
bzero(&server, sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_port = htons(69);
server.sin_addr.s_addr = inet_addr("192.168.220.59");
printf("please input read?write:1 or 2: ");
scanf("%d",&num);
rew = sprintf(read_cmd,"%c%c%s%c%s%c",0,num,filename,0,"octet",0);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
{
perror("Invalid socket");
exit(1);
}
sendto(sockfd, read_cmd, rew, 0, (struct sockaddr*)&server, sizeof(struct sockaddr));
if((fd = open(filename, O_RDWR|O_CREAT))<0)
{
perror("open");
exit(1);
}
if (num == 1)
{
num = 0;
do{
bzero(buf,sizeof(buf));
recv = recvfrom(sockfd, buf, 516, 0, (struct sockaddr*)&server, &addrlen);
write(fd, buf+4, 512);
if(n == 255)
{
num++;
n = -1;
}
rew = sprintf(read_cmd,"%c%c%c%c",0,4,num,++n);
sendto(sockfd, read_cmd, rew, 0, (struct sockaddr*)&server, sizeof(struct sockaddr));
}while(recv == 516);
}
if( num == 2)
{
do{
bzero(buf,sizeof(buf));
recvfrom(sockfd, buf, 4, 0, (struct sockaddr*)&server, &addrlen);
buf[1] = 3;
if((unsigned char)buf[3]==255)
{
buf[2]++;
}
buf[3]++;
read_num = read(fd,buf+4,512);
printf("%d\n",send_num);
send_num = sendto(sockfd, buf, read_num+4, 0, (struct sockaddr*)&server, sizeof(struct sockaddr));
}while(read_num==512);
}
close(fd);
return 0;
}
上一篇:UDP类型的 client/server 实例
下一篇:socket网络编程函数
- 担任公诉案件一、二审被告人辩...
- 外商投资企业的公司治理法律事...
- 代理知识产权案件的诉讼或仲裁...
- 扶养纠纷 锡降落
- 处理劳资纠纷 理论
- linux 常见服务端口
- 【ROOTFS搭建】busybox的httpd...
- 什么是shell
- linux socket的bug??
- linux的线程是否受到了保护?...
- 我的ChinaUnix博客被锁定了,...
- 虚拟机中ubuntu无线连接问题...
- IBM DS3400 盘阵怎么查看是单...
- 启动auditd时,报错如下,怎么...
- CGSL系统中root密码正确,但无...
- tftp协议的实现
- tftp协议的实现
- TFTP协议实现
- tftp协议的实现
- linux实现TFTP协议
- tftp网络协议实现
- TFTP协议的实现
- tftp协议的实现
- TFTP协议的实现
- TFTP协议在嵌入式系统中的实现
- TFTP协议
- TFTP协议
- TFTP协议
- TFTP协议
- TFTP协议
- Linux UDP下C语言实现TFTP协议客户端
- Linux UDP下C语言实现TFTP协议客户端 .
- Linux下tftp协议实现(服务器端、客户端)
- 麻烦牛人帮忙解释一下
- 知识点
- 简单的广播收发
- UDP类型的 client/server 实例
- 浅谈阅读LINUX内核源码
- TFTP协议实现
- socket网络编程函数
- ZOJ 3569 Dr. Zomboss's Revenge(贪心)
- 巧妙的在cygwin中添加clear命令
- IEEE 802家族
- counting--线段树
- 人性的弱点
- Java中堆、栈、常量池等概念解析
- 线程中断之interrupt和stop方法