C语言 简单的文件下载器
来源:互联网 发布:淘宝开放平台 开发语言 编辑:程序博客网 时间:2024/05/21 06:49
代码中的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 1 bzero(buf,sizeof(buf)); strcpy(buf,"####"); send(connfd,buf,4,0); #endif closedir(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; } else break; } 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); else break; } } 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;}
阅读全文
0 0
- C语言 简单的文件下载器
- C语言最简单的文件操作
- C语言简单的文件加密
- C语言 HTTP 下载文件
- C语言自制文件分割器(简单)
- 简单的文件下载
- 简单的文件下载
- C语言简单文件操作
- c语言简单文件加密
- c语言写的多线程下载器
- C语言写的多线程下载器
- C语言写的多线程下载器
- socket http文件下载器c语言实现
- 简单的c语言
- C语言编译的顺序。关于 .c 文件 .h 文件的用法。Makefile文件简单概念。
- C语言写的一个简单文件加密程序
- c语言实现最简单的写文件操作
- 简单的文件加密系统C语言代码
- Python API 操作Hadoop hdfs
- linux之用echo输入数据到文本末尾以及用open ssl命令在证书文件里面获取公钥
- g++编译动态链接库*.so调用另一个*.so的方法
- java核心技术Ⅰ 开题
- ssh的运行原理
- C语言 简单的文件下载器
- postgresql
- 马克·扎克伯格简介
- Python《机器学习实战》读书笔记(二)——k-近邻算法
- HIVE中 ROW_NUMBER() OVER() 函数
- 树状数组—(离散化)求比较大的数逆序数的个数
- ajax在什么情况下会走success和error
- next_permutation(全排列)
- 718. Maximum Length of Repeated Subarray【Medium】 动归