udpTFTP
#include <2503.h>
int do_downlond(int sfd, struct sockaddr_in seraddr)
{
char buf[516]="";//数据包
int file_fd; //open 产生的 文件描述符
char filename[128] = "";//文件名
printf("输入文件名:\n");
scanf("%s",filename);
unsigned short num =1;
unsigned short code_num;
snprintf(buf,sizeof(buf),"%c%c%s%c%s%c",0,1,filename,0,"octet",0);
//给服务器 发送一下 请求
if(-1 == sendto(sfd,buf,sizeof(buf),0,(struct sockaddr *)&seraddr,sizeof(seraddr)))
{
perror("sendto error");
return -1;
}
printf("%d%d%s%c%s%c",0,1,filename,0,"octet",0);
printf("发送成功--------------\n");
struct sockaddr_in ser_com={0};// 定义 接受 服务器 发来的ip port
socklen_t ser_len = sizeof(ser_com);
int ret;
while(1)
{
memset(buf,0,sizeof(buf));//置空字符串
//接受 服务器 发送的数据包
if(0>=(ret = recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&ser_com,&ser_len)))
{
perror("recvfrom error");
return -1;
}
printf("%s\n",buf);
unsigned short *p = (unsigned short*)buf;
unsigned short code = *p;
printf("%#x | %d\n",ntohs(code),buf[1]);
code_num = ntohs(*((short*)(buf+2)));// 存储块 编号
printf("%d\n",code_num);
//通过接受的 数据包的 操作码 操作
if(buf[1] == 3)
{
printf("进入接受\n");
if(code_num == 1)
{
umask(0);
file_fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0664);
printf("打开文件一次\n");
}
if(code_num == num)
{
//写入本地文件
write(file_fd,buf+4,ret-4);
//回复 服务器 前四个 字节
buf[1] = 4;
if(-1 == sendto(sfd,buf,4,0,(struct sockaddr*)&ser_com,sizeof(ser_com)))
{
perror("sendto error");
return -1;
}
num++;
}
if(ret-4<512)
{
printf("文件下载结束...\n");
break;
}
}else if(buf[1] == 5)
{
printf("[%d]:错误信息:%s",code_num,buf+4);
break;
}
}
return -1;
}
int do_uploading(int sfd, struct sockaddr_in seraddr)
{
char buf[516]="";//数据包
int file_fd; //open 产生的 文件描述符
char filename[128] = "";//文件名
printf("输入文件名:\n");
scanf("%s",filename);
unsigned short num =0;
unsigned short code_num;
int ret;
snprintf(buf,sizeof(buf),"%c%c%s%c%s%c",0,2,filename,0,"octet",0);
//给服务器 发请求
if(-1 == sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&seraddr,sizeof(seraddr)))
{
perror("sendto error");
return -1;
}
printf("上传请求发送成功......\n");
struct sockaddr_in ser_com = {0};
socklen_t ser_len = sizeof(ser_com);
while(1)
{
memset(buf,0,sizeof(buf));
if(0>(ret= recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&ser_com,&ser_len)))
{
perror("recvfrom error");
return -1;
}
unsigned short *p = (unsigned short*)buf;
unsigned short code = *p;
printf("%#x | %d\n",ntohs(code),buf[1]);
code_num = ntohs(*((short*)(buf+2)));// 存储块 编号
printf("编号 buf=[%d]\n",buf[3]);
printf("code_num=%d\n",code_num);
if(buf[1] == 4)
{
// 打开要上传的 文件
if(code_num==0)
{
file_fd = open(filename,O_RDONLY);
}
memset(buf,0,sizeof(buf));
ret = read(file_fd,buf+4,512);
if(ret<0)
{
perror("ret error");
return -1;
}
if(ret == 0)
{
printf("读取完毕..\n");
break;
}
num++;
buf[1]=3;
printf("buf=[%d]\n",buf[3]);
buf[3]++;
if(-1 == sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&ser_com,sizeof(ser_com)))
{
perror("sendto ssserrpr");
return -1;
}
printf("发送成功\n");
if(ret <512)
{
printf("上传完了\n");
break;
}
}else if(buf[1] == 5)
{
printf("[%d]:错误信息:%s",code_num,buf+4);
break;
}
}
return -1;
}
int main(int argc, const char *argv[])
{
//1.套接字 socket
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if(-1 == sfd)
{
perror("socket error");
return -1;
}
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = (htons(69));
seraddr.sin_addr.s_addr = inet_addr("192.168.128.74");
char choose;
while(1)
{
printf("-------------------------------------------------\n");
printf("-----------------1. 下载---------------------\n");
printf("-----------------2. 上传---------------------\n");
printf("-----------------3. 退出---------------------\n");
printf("请输入您的选择:\n");
scanf("%c",&choose);
switch(choose)
{
case '1':
do_downlond(sfd,seraddr);
break;
case '2':
do_uploading(sfd,seraddr);
break;
case '3':
printf("退出了\n");
close(sfd);
return -1;
}
}
return 0;
}



305

被折叠的 条评论
为什么被折叠?



