代码中的ip地址写的都是回环测试ip,如果要在两个电脑之间,请修改代码中ip地址一行。然后服务器中的文件夹路径改为您的。
写的不好,您多担待。

服务器部分:

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
char buf[64] = "\0";
DIR *dir;
struct dirent *p;
int listenfd, connfd;
int fd;
int ret;void list()
{dir = opendir("/home/fs/17091/class");if (NULL == dir){perror("opendir");exit(0);}while((p = readdir(dir)) != NULL) {bzero(buf,sizeof(buf));if (0 == strncmp(".",p->d_name,1))continue;strcpy(buf,p->d_name);send(connfd,buf,64,0);}#if 1bzero(buf,sizeof(buf));strcpy(buf,"####");send(connfd,buf,4,0);#endifclosedir(dir);return;
}void download(char buf[])
{char name[64] = "/home/fs/17091/class/";char *p = buf+4;int n;strcat(name,p);name[strlen(name)-1] = '\0';fd = open(name,O_RDONLY);if (-1 == fd){close(connfd);return;}while ((n = read(fd,buf,64)) > 0){write(connfd,buf,n);bzero(buf,sizeof(buf));}printf("传输完毕\n");close(connfd);close(fd);
}void upload(char buf[])
{char msg[64] = "\0";if (recv(connfd, msg, 64, 0) <= 0){close(connfd);return;}else{char name[64] = "/home/fs/17091/class/";char *p = buf+4;int n;strcat(name,p);name[strlen(name)-1] = '\0';fd = open(name,O_WRONLY | O_CREAT | O_TRUNC,0666);if (-1 == fd){strcpy(buf,"fail");send(connfd,buf,64,0);return;}while ((n = read(connfd,buf,64)) > 0){write(fd,buf,n);bzero(buf,sizeof(buf));}printf("上传完毕\n");close(connfd);close(fd);}}
int main(int argc, const char *argv[])
{struct sockaddr_in seraddr, cliaddr;socklen_t addrlen = sizeof(cliaddr);//step 1:创建套接字接口listenfd = socket(AF_INET, SOCK_STREAM, 0);if (-1 == listenfd){perror("socket");return -1;}//step 2:绑定IP地址和端口号memset(&seraddr, 0, sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_port = htons(8888);seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");ret = bind(listenfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if (-1 == ret){perror("bind");return -1;}//step 3:监听连接请求ret = listen(listenfd, 5);if (-1 == ret){perror("listen");return -1;}//step 4:接受连接请求while(1){connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &addrlen);if(-1 == connfd){perror("accept");return -1;}printf("accept successfully, client ip = %s, port = %d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));while(1){//接受数据bzero(buf,sizeof(buf));ret = recv(connfd, buf, sizeof(buf), 0);if (-1 == ret){perror("read");return -1;}if (0 == strncmp("list",buf,4)){list();break; }else if (0 == strncmp("get",buf,3)){download(buf);break; }else if (0 == strncmp("put",buf,3)){upload(buf);break; }elsebreak;}close(connfd);}close(listenfd);return 0;
}

客户端部分:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
char buf[64] = "\0";
int fd;
int ret;int init_net()
{struct sockaddr_in seraddr;int connfd;//step 1: 创建套接字接口connfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == connfd){perror("socket");return -1;}//step 2: 发起连接请求memset(&seraddr, 0, sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_port = htons(8888);seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");ret = connect(connfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if(-1 == ret){perror("connect");return -1;}return connfd;}
void help()
{printf("hlep:显示客户端所有命令和说明\n");printf("list:显示服务器端可下载文件列表\n");printf("get+空格+文件名:下载文件\n");printf("put+空格+文件名:上传文件\n");printf("quit:退出客户端\n");
}void list()
{int connfd;connfd = init_net();strcpy(buf,"list");ret = send(connfd, buf, sizeof(buf), 0);    if(-1 == ret){perror("send");return;}while (1){if ((recv(connfd,buf,64,0) > 0)){if (strncmp("####",buf,4) != 0) printf("%s\n",buf);elsebreak;}}close(connfd);return;
}void download(char buf[])
{int connfd;char msg[64] = "\0";connfd = init_net();send(connfd,buf,64,0);if (recv(connfd,msg,64,0) <= 0){printf("没有这个文件,无法下载\n");close(connfd);return;}else{int n;char *p = buf+4;char name[64] = "/home/fs/17091/play/download/";strcat(name,p);name[strlen(name)-1] = '\0';fd = open(name,O_WRONLY | O_CREAT | O_TRUNC,0666);if (-1 == fd){perror("open");return;}while ((n = read(connfd,buf,64)) > 0){write(fd,buf,n);bzero(buf,sizeof(buf));}printf("下载完成\n");close(fd);close(connfd);return;}
}void upload(char buf[])
{int connfd;connfd = init_net();send(connfd,buf,64,0);int n;char *p = buf+4;char name[64] = "/home/fs/17091/play/download/";strcat(name,p);name[strlen(name)-1] = '\0';fd = open(name,O_RDONLY);if (-1 == fd){printf("没有这个文件,无法上传\n");close(connfd);return;}while ((n = read(fd,buf,64)) > 0){write(connfd,buf,n);bzero(buf,sizeof(buf));}printf("上传完成\n");close(fd);close(connfd);return;}
int main(int argc, const char *argv[])
{while (1){system("clear");printf("请输入选项,输入'help'查看帮助\n");printf("input>>");fgets(buf,sizeof(buf),stdin);if (0 == strncmp("help",buf,4)){help();printf("输入Enter键继续\n");getchar();continue;}if (0 == strncmp("list",buf,4)){list();printf("输入Enter键继续\n");getchar();continue;}else if (0 == strncmp("get",buf,3)){printf("开始下载\n");download(buf);printf("输入Enter键继续\n");getchar();continue;}else if (0 == strncmp("put",buf,3)){printf("开始上传\n");upload(buf);printf("输入Enter键继续\n");getchar();continue;}else if (0 == strncmp("quit",buf,4)){printf("欢迎下次使用,祝您生活愉快\n");break;}else{printf("输入有误,请输入Enter键继续\n");getchar();continue;}}return 0;
}

C语言 简单的文件下载器相关推荐

  1. python写一个文件下载器_python使用tcp实现一个简单的下载器

    上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识. 文件下载器的流程如下: 客户端: 输入目标服务器的ip和port 输入要下载文件的名称 从服务器下载文件保存到本地 ...

  2. 使用网络TCP搭建一个简单文件下载器

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶项目介绍 二丶服务器Server 三丶测试TCP server服务器 四丶客户端Client 五丶测试客户端向服务器下载 ...

  3. Go语言写的解析器(支持json,linq,sql,net,http等)

    Monkey程序语言 Monkey v2.0版本已发布. monkey v2.0 增加了如下内容: 新增 short arrow(->)支持(类似C#的lambda表达式) 增加 列表推导和哈希 ...

  4. 主流WEB开发语言简单对比(转)

    主流WEB开发语言简单对比  原文链接:http://www.uml.org.cn/site/201401091.asp   随着时间的飞逝,随着岁月的流失.从世界上第一台计算机ENIAC诞生至今,已 ...

  5. 【多线程编程学习】java多线程基于数据分割的大文件下载器

    文章目录 代码:基于数据分割的大文件下载器 作为包装的存储对象类: 主文件下载类: 子任务下载类: 处理缓存: 启动类: 数据分割思想产生的问题 代码来自书籍<java多线程编程实战指南> ...

  6. renameto 阻塞_打造简化版文件下载器

    一. 前言 Executors 是一种典型的生产者 - 消费者模式, java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.线程池就是将线程进行池化,需要运 ...

  7. java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)

    java计算机毕业设计vue开发一个简单音乐播放器(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...

  8. c语言远控,远控鼠标!C语言简单编程:整舍友必备+附送实例源码!

    远控鼠标!C语言简单编程:整舍友必备+附送实例源码!-1.jpg (10.71 KB, 下载次数: 0) 2018-10-11 05:24 上传 关注<一碳科技>有更多干货等着你哦! 远控 ...

  9. java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 本源码技 ...

  10. CE+C语言制作PVZ修改器(一)——自定义阳光数量

    前前言 上半年疫情在家的时候实在无聊,文艺复兴,把PVZ几个版本又玩了一遍,本来打算写个修改器,结果鸽到现在因为各种事情耽搁到现在.以后有时间就尽量更新,估计这个系列要写很久 另:PVZ各版本合集搜& ...

最新文章

  1. 动态给a标签赋值_怎样利用Excel制作抖音上的心形动态函数图像?
  2. Java学习笔记—生产者和消费者模式
  3. oracle13001,安装oracle11g 遇到INS-13001环境不知足最低要求 解决方法
  4. Github PageHelper 原理解析
  5. java 多行文本框_Swing常用组件之多行文本区JTextArea
  6. 合成孔径成像算法与实现_MIMO OFDM宽幅SAR成像仿真与图像融合技术
  7. 大学计算机专业挂科人多吗,这几个专业真的是太难了,挂科率年年都是新高,很多人都后悔了...
  8. 项目学习 - 收藏集 - 掘金
  9. Type safety: The method add(Object) belongs to the raw type List. References to generic type List<E>
  10. 在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)...
  11. HTML跳转php没反应的问题解决
  12. android jni介绍
  13. Hibernate主键生成策略
  14. 【学术】参考文献管理
  15. C++语言Switch函数使用小贴士
  16. Hive之数仓的分层及建模理论(3)
  17. SAS V8版本 运行后总是提示ERROR: Permanent copy of file WORK._tf0008.ITEMSTOR was deleted. 请问该怎么解决
  18. showdialog 尝试读取或写入受保护的内存_轻松一键上4000MHz,XPG龙耀D50 重装RGB内存值不值得高端用户选购?...
  19. MySQL编码致使varchar类型不区分大小写
  20. 【Go入门】Go语言基础知识

热门文章

  1. 关于“商用超极本应用体验分享沙龙”的体验之旅——商用超极本的崛起之路、真机实测、优缺点分析与使用评价
  2. 斯坦福NLP名课带学详解 | CS224n 第1讲 - NLP介绍与词向量初步(NLP通关指南·完结)
  3. 51单片机学习笔记(清翔版)(23)——红外通讯
  4. 爱普生l301打印机驱动 电脑版
  5. pgAdmin4数据库备份还原
  6. 计算机的管理选项文件错误,如何修复Microsoft Teams错误文件在Windows PC中被锁定...
  7. 键鼠硬件模拟技术(转)
  8. kafka的分布式爬虫系统
  9. 用matlab绘制函数图像
  10. Win10取消开机密码