项目功能:实现服务器与客户端的下载与上传,及linux系统下的tftp功能

项目名称:tftp--实现服务器与客户端的下载与上传

开发环境:linux /C

开发工具:GCC/GDB

网络协议:TCP/IP

补充说明:程序中默认server端有upload文件夹用以接收client端上传的数据,client端有download文件夹用以下载server端的文件

开发流程:

编译流程:

1.cc    server.c  -o server

2.cc  client.c  -o client

运行l流程:

1.  ./server  192.168.1.207(server ip)  8888(port)

2. ./client    192.168.1.207  8888

调试效果:

client 端

server 端

1.server.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<signal.h>
#include<errno.h>#include <dirent.h>typedef struct { char cmd[10];int size;char buf[1024];
}MSG;
MSG msg;
enum{list,get,put};
int     do_list(int connect_fd)
{char buf[1024];int n;int fd;DIR *pdir;struct dirent *pdirent;if((pdir = opendir(".")) == NULL){perror("Fail to open directory ");exit(EXIT_FAILURE);}while((pdirent = readdir(pdir)) != NULL){if(pdirent->d_name[0] == '.' )continue;strcpy(msg.buf,pdirent->d_name);msg.size = strlen(msg.buf);msg.size = send(connect_fd,&msg,sizeof(MSG),0);}msg.size = 0;send(connect_fd,&msg,sizeof(MSG),0);puts("send list successfully");   return 0;
}int do_get(int connect_fd)
{char filename[10];int n;int fd;struct stat fileinfo;if(recv(connect_fd,&msg,sizeof(MSG),0) < 0){perror("fail to recv");exit(EXIT_FAILURE);    }if(stat(msg.buf,&fileinfo) < 0){perror("fail to stat");msg.size = -1;strcpy(msg.buf,strerror(errno));send(connect_fd,&msg,sizeof(MSG),0);return -1;}msg.size = fileinfo.st_size;strcpy(filename,msg.buf);puts("***********************");printf("send file size : %d\n",msg.size);printf("send filename : %s\n",msg.buf);puts("***********************");if(send(connect_fd,&msg,sizeof(MSG),0) < 0){perror("fail to recv");exit(EXIT_FAILURE);    }if((fd = open(msg.buf,O_RDONLY)) < 0){fprintf(stderr,"Fail to open %s, %s\n",msg.buf,strerror(errno));exit(EXIT_FAILURE);}while(1){msg.size = read(fd, msg.buf,sizeof(msg.buf));send(connect_fd,&msg,sizeof(MSG),0);if(msg.size == 0)break;}printf("send file %s successfully\n",filename);return 0;
}
int do_put(int connect_fd)
{char buf[1024];int n;int fd;if(recv(connect_fd,&msg,sizeof(msg),0) <= 0){perror("fail to recv");exit(EXIT_FAILURE);}puts("**********************************");printf("upload filename  : %s\n",msg.buf);printf("size:   %d\n",msg.size);puts("**********************************");strcpy(buf,"./upload/");strcat(buf,msg.buf);if((fd = open(buf,O_WRONLY | O_CREAT | O_TRUNC,0666)) < 0){perror("Fail to accept");exit(EXIT_FAILURE);}ftruncate(fd,msg.size);while(1){recv(connect_fd,&msg,sizeof(MSG),0);write(fd,msg.buf,msg.size);if(msg.size == 0)break;}printf("send file successfully!\n");exit(EXIT_SUCCESS);}
int  getcmd(char *pcmd)
{if(strcmp(pcmd,"list") == 0)return 0;if(strcmp(pcmd,"get") == 0)return 1;if(strcmp(pcmd,"put") == 0)return 2;
}
void    do_task(int connect_fd,char *cmd)
{MSG msg;switch(getcmd(cmd)){case put:printf("recv file  from client...\n");do_put(connect_fd);break;case get:printf("send file to  client...\n");do_get(connect_fd);break;case list:printf("send file list to client...\n");do_list(connect_fd);break;default :break;}return;
}
int do_client(int connect_fd)
{MSG msg;int n;while(1){if((n =recv(connect_fd,&msg,sizeof(msg),0) )< 0){perror("fail to recv");exit(EXIT_FAILURE);}if(n == 0)break;do_task(connect_fd,msg.cmd);}exit(EXIT_FAILURE);
}
void signal_handler(int signum)
{waitpid(-1,NULL,WNOHANG);return;
}
int main(int argc, const char *argv[])
{pid_t pid;int listen_fd;int connect_fd;socklen_t addrlen;struct sockaddr_in peer_addr;struct sockaddr_in server_addr;if(argc < 0){perror("fail to argc");exit(EXIT_FAILURE);}if(signal(SIGCHLD,signal_handler) == SIG_ERR){perror("fail to signal");exit(EXIT_FAILURE);}if((listen_fd = socket(AF_INET,SOCK_STREAM,0) )< 0){perror("fail to socket");exit(EXIT_FAILURE);}memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(atoi(argv[2]));server_addr.sin_addr.s_addr =inet_addr(argv[1]);if(bind(listen_fd,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0) //描述本机端口和IP,要知道数据包发往哪个进程{perror("Fail to bind");exit(EXIT_FAILURE);}if(listen(listen_fd,8 ) < 0)//监听连接的套接字,接收各客户端的请求,返回监听套接字文件描述符{perror("Fail to listen");exit(EXIT_FAILURE);}puts("listening ...");addrlen = sizeof(peer_addr);  while(1){if((connect_fd = accept(listen_fd,(struct sockaddr *)&peer_addr,&addrlen)) < 0){perror("Fail to accept");//提取客户发过来的请求,返回新的已连接的套接字文件描述符exit(EXIT_FAILURE);}puts("*************************");printf("IP : %s\n",inet_ntoa(peer_addr.sin_addr));printf("PORT : %d\n",ntohs(peer_addr.sin_port));puts("*************************");if((pid = fork()) < 0)  {perror("Fail to listen");exit(EXIT_FAILURE);}if(pid == 0){do_client(connect_fd);}close(connect_fd);}exit(EXIT_FAILURE);
}

2.client.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<errno.h>typedef struct {char cmd[10];int size;char buf[1024];
}MSG;enum{list,get,put};
int do_list(client_fd,pname)
{MSG msg;int fd;while(1){recv(client_fd,&msg,sizeof(MSG),0);if(msg.size == 0)break;printf("%s\n",msg.buf);}puts("get list successfully"); return 0;
}int    do_get(int client_fd,char *filename)
{MSG msg;int fd;char buf[1024];strcpy(msg.buf,filename);if(send (client_fd,&msg,sizeof(MSG),0) < 0){perror("Fail to send");exit(EXIT_FAILURE);}recv(client_fd,&msg,sizeof(MSG),0);if(msg.size < 0)  {printf("Error :%s  \n",msg.buf);return -1;}puts("***********************");printf(" download file size : %d\n",msg.size);printf(" download filename : %s\n",msg.buf);puts("***********************");strcpy(buf,"./download/");strcat(buf,msg.buf);if((fd = open(buf,O_WRONLY | O_CREAT | O_TRUNC,0666)) < 0){fprintf(stderr,"Fail to open %s,%s\n",buf,strerror(errno));exit(EXIT_FAILURE);}ftruncate(fd, msg.size);while(1){recv(client_fd,&msg,sizeof(MSG),0);if(msg.size == 0)break;write(fd,msg.buf,msg.size);} printf("download file %s successfully\n",filename);return 0;
}
int do_put(int client_fd,char *filename)
{MSG msg;int fd;int n;if((fd = open(filename,O_RDONLY)) < 0){perror("Fail to open");exit(EXIT_FAILURE);}msg.size  = lseek(fd,0,SEEK_END);strcpy(msg.buf,filename);lseek(fd,0,SEEK_SET);puts("**********************************");printf("filename : %s\n",msg.buf);printf("size :%d\n",msg.size);puts("**********************************");if(send(client_fd,&msg,sizeof(MSG),0) < 0){perror("Fail to send");exit(EXIT_FAILURE);}while(1){msg.size = read(fd,msg.buf,sizeof(msg.buf));if(send(client_fd,&msg,sizeof(MSG),0) < 0){perror("Fail to read");exit(EXIT_FAILURE);}    if(msg.size == 0)break;}printf("upload file successfully!\n");return 0;
}
int  getcmd(char *pcmd)
{if(strcmp(pcmd,"list") == 0)return 0;if(strcmp(pcmd,"get") == 0)return 1;if(strcmp(pcmd,"put") == 0)return 2;
}
int do_task(char *pcmd,char *pname,int client_fd)
{MSG msg;char buf[1024];int fd;switch(getcmd(pcmd)){case list:printf("get file list from the server ...\n");strcpy(msg.cmd,pcmd);if(send(client_fd,&msg,sizeof(MSG),0) < 0){perror("FAIL to send");exit(EXIT_FAILURE);}do_list(client_fd,pname);break;case get:printf("file  %s is downloading from server ...\n",pname);strcpy(msg.cmd , pcmd);if(send(client_fd,&msg,sizeof(MSG),0) < 0){perror("FAIL to send");exit(EXIT_FAILURE);}do_get(client_fd,pname);break;case put:printf(" file  %s is uploading to server ...\n",pname);strcpy(msg.cmd,pcmd);if(send(client_fd,&msg,sizeof(MSG),0) < 0){perror("Fail to send!");exit(EXIT_FAILURE);}do_put(client_fd,pname);break;default:break;}return 0;}
int main(int argc, const char *argv[])
{MSG msg;char buf[1024];char *pname,*pcmd;int client_fd;pid_t  pid;int connect_fd;socklen_t addrlen;struct sockaddr_in server_addr;if((client_fd = socket(AF_INET,SOCK_STREAM,0) )< 0){perror("fail to socket");exit(EXIT_FAILURE);}memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr =inet_addr(argv[1]);server_addr.sin_port = htons(atoi(argv[2]));if(connect(client_fd,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0)  {perror("Fail to accept");exit(EXIT_FAILURE);}while(1){printf("tftp>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf) -1] = '\0';if(strncmp(buf,"quit",4) == 0)break;pcmd = strtok(buf," ");pname = strtok(NULL," ");do_task(pcmd,pname,client_fd);}exit(EXIT_FAILURE);return 0;
}

tftp--实现服务器与客户端的下载与上传相关推荐

  1. java上传音频到服务器_Java 客户端向服务端上传mp3文件数据的实例代码

    客户端: package cn.itcast.uploadpicture.demo; import java.io.BufferedInputStream; import java.io.FileIn ...

  2. 【TFTP客户端--实现下载文件和上传文件】

    TFTP客户端--实现下载文件和上传文件 TFTP协议 文件下载 文件上传 main TFTP协议 TFTP是一个传输文件的简单协议,它其于UDP协议而实现,但是我们也不能确定有些TFTP协议是基于其 ...

  3. HTML转Canvas工具 前端生成图片工具 屏幕快照 html2canvas 下载 或上传至服务器 使用方法

    HTML转Canvas工具 前端生成图片工具 屏幕快照 html2canvas 下载 或上传至服务器 使用方法 <!-- 如果需要显示照片--><!-- <img :src=& ...

  4. MobaXterm连接远程服务器,使用Linux命令行上传下载文件

    文章目录 一.MobaXterm连接远程服务器 二.Linux命令行上传和下载文件 三.服务器挂载U盘传输文件 四..ipynb文件转化为.py文件 五.关闭本地电脑,服务器运行python 项目 问 ...

  5. servlet文件上传下载_Servlet上传文件和下载文件示例

    servlet文件上传下载 Java Web应用程序中的文件上载和下载以及常见任务. 由于最近我写了很多有关Java servlet的文章 ,因此我想提供一个使用servlet上传和下载文件的示例示例 ...

  6. 怎么把手机文件导入华为云服务器,华为手机怎么把软件上传到云服务器

    华为手机怎么把软件上传到云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分 ...

  7. Java字节流与字符流,断点续传实现分片下载、上传、合并

    文章目录 一:字节流和字符流详解 1.1 流的概念 1.2 流的分类 1.3 字节流,字符流区别与使用场景 1.3.1 区别 1.3.2 使用场景 1.3.3 顶级父类 1.3.4 对比--总结对比字 ...

  8. 文件已上传服务器去哪找,ftp文件服务器上传后的文件在哪

    ftp文件服务器上传后的文件在哪 内容精选 换一换 FTP/SFTP连接适用于从线下文件服务器或ECS服务器上迁移文件到OBS或数据库.当前仅支持Linux操作系统的FTP 服务器.连接FTP或SFT ...

  9. 下载批量上传试题的模板

    来源于老师讲课的项目中 /// /// 1.1下载批量上传试题的模板 /// /// public ActionResult DownloadTemplet() { string path = Ser ...

最新文章

  1. 多台计算机怎样才能同时使用互联网,如何实现一台路由器多台计算机同时上网...
  2. UVA227-Puzzle
  3. Docker和Kubernetes如何让DevOps更具效力
  4. 个人猜测一下《黑神话:悟空》的部分剧情
  5. 退化射线和净化装置获得法
  6. C++_new创建的数组作为参数传递
  7. spring boot2 kafka
  8. shell学习之awk或gawk
  9. jquery 插件 国外
  10. QT ListView 记录
  11. 浏览器自动调html5,HTML与浏览器
  12. 存着-在重置电脑时删除了应用
  13. SLAM入门-相机成像原理与公式推导
  14. 自动控制原理 (二): 控制系统的微分方程
  15. maya如何查看资源大纲_干货|Maya入门到精通完全自学教程大纲(建模篇)
  16. 机器人开发--NDC方案
  17. 360抢票 网站维护中 你的登录被踢了!
  18. 黑魂3无法从服务器获取信息,黑魂3怎么读取信息 | 手游网游页游攻略大全
  19. Python中条件判读语句if的使用详解
  20. php订阅号发送消息,php实现微信公众号主动推送消息

热门文章

  1. 选择分支语句详解--(if与witch的使用)
  2. 现代化的中国教育,缺失的不是钱,是思想(之三)--目前的教育模式无法直面信息技术的发展
  3. 蒸汽发生器熨斗行业调研报告 - 市场现状分析与发展前景预测
  4. Handler的底层原理实现
  5. javascript面试题(初/中级前端开发工程师)
  6. ISO27001是什么?办理流程有哪些?
  7. 使用python连接mysql出现中文乱码
  8. 国外经典脚本下载网站
  9. 城市燃气运营模式解析与商业智能 BI 分析知识体系
  10. 用计算机来算出情人节,关于情人节的说说短句子 有关情人节的爱情句子