tcp实现简单的文件服务器(只能传文件)
来源:互联网 发布:微电影知乎 编辑:程序博客网 时间:2024/04/30 19:25
程序实现如下功能:
1.ls -- 显示服务器下的文件列表
2.get filename -- 下载文件(服务器下载到客户端)
3.put filename -- 上传文件(客户端上传到服务器)
4.remove filename -- 删除文件(删除服务器的文件)
ps:自己写的代码太烂了,自己都不想看,跟看到一堆翔一样。。。。。
服务器端:
/*************************************************************************> File Name: file_server.c> Author: qinf> Mail: > Created Time: Sat 05 Apr 2014 09:40:25 AM CST ************************************************************************/#include "file_server.h"#define IN 1#define OUT 0#define MAX_LEN 128//处理client发来的命令void *thread_function(void *arg);void cmd_handle(char *cmd, char *result);int main(int argc, char *argv[]){//变量定义int server_fd, client_fd, iret;pthread_t a_thread;struct sockaddr_in server_addr, client_addr;struct thread_msg message;memset(&message, '\0', sizeof(message));char result[128];char cmd[128];memset(cmd, '\0', 128);memset(result, '\0', 128);//socketserver_fd = socket(AF_INET, SOCK_STREAM, 0);if (-1 == server_fd) {perror("socket");exit(EXIT_FAILURE);}//bindserver_addr.sin_family = AF_INET;server_addr.sin_port = htons(atoi(argv[2]));server_addr.sin_addr.s_addr = inet_addr(argv[1]); int on=1; if((setsockopt(server_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0) { perror("setsockopt failed"); exit(EXIT_FAILURE); } iret = bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));if (-1 == iret) {perror("bind");exit(EXIT_FAILURE);;}//listeniret = listen(server_fd, 5);if (-1 == iret) {perror("listen");exit(EXIT_FAILURE);}//accept,交给线程处理int len= sizeof(client_addr);while (1) {client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &len);if (-1 == client_fd) {perror("client_fd");exit(EXIT_FAILURE);}iret = pthread_create(&a_thread, NULL, (void *)thread_function, &client_fd);if (0 != iret) {perror("pthread_create");exit(EXIT_FAILURE);}}//closeclose(server_fd);}//处理client发来的命令void *thread_function(void *arg) {int client_fd = *(int *)arg;char cmd[128];char result[128];DIR *dir;struct dirent *dir_ptr;char *filenames[MAX_LEN];int num = 0, i = 0, iret;int fd;dir = opendir("./");if (NULL == dir) {perror("opendir");exit(EXIT_FAILURE);}while ((dir_ptr = readdir(dir)) != NULL) {filenames[num] = (char *)malloc(sizeof(char) * 128);memset(filenames[num], '\0', 128);strcpy(filenames[num], dir_ptr->d_name);printf("%s\n", filenames[num]);//打印目录++num;printf("num=%d\n", num);}while (1) {memset(cmd, '\0', 128);memset(result, '\0', 128);// recv(client_fd, cmd, 128, 0);recv(client_fd, cmd, 9, 0);printf("cmd===%s\n", cmd);strcpy(result, cmd);printf("%s\n", result);//处理命令i = 0;char name[128];char buf[128];int len;if (strncmp(result, "ls", 2) == 0) {send(client_fd, &num, sizeof(int), 0);while (filenames[i] != NULL) {filenames[i][strlen(filenames[i])] = '\n';send(client_fd, filenames[i], strlen(filenames[i]), 0);//printf("%s\n", filenames[i]);++i;}} else if(strncmp(result, "remove", 6) == 0) {//name = &result[7];sprintf(name, "./%s", &result[7]);name[strlen(name)-1] = '\0';iret = unlink(name);if (-1 == iret) {perror("unlink");exit(EXIT_FAILURE);} else {memset(result, '\0', 128);strcpy(result, "file removed!");iret = send(client_fd, &result, strlen(result), 0);if (-1 == iret) {perror("send");exit(EXIT_FAILURE);}}} else if (strncmp(result, "get", 3) == 0) {sprintf(name, "./%s", &result[4]);printf("name=%s,,len=%d\n", name, strlen(name));fd = open(name, O_RDONLY);if(-1 == fd) {perror("open");exit(EXIT_FAILURE);}memset(buf, '\0', 128);while ((iret = read(fd, buf, 128)) > 0) {send(client_fd, buf, iret, 0);memset(buf, '\0', 128);}close(fd);printf("translate over!\n");} else if (strncmp(result, "put", 3) == 0) {off_t file_size;off_t tmp = 0;memset(name, '\0', 128);memset(buf, '\0', 128);strcpy(name, &result[4]);printf("name=%s\n", name);fd = open(name, O_WRONLY|O_CREAT, 0666);if (-1 == fd) {perror("open file");exit(EXIT_FAILURE);}printf("fd=%d\n", fd);iret = recv(client_fd, &file_size, sizeof(file_size), 0);if (-1 == iret) {perror("recv");exit(EXIT_FAILURE);}while((iret = recv(client_fd, buf, 128, 0)) > 0) {write(fd, buf, iret);tmp += iret;if (file_size == tmp)break;memset(buf, '\0', 128);}printf("put over!\n");} else if (strncmp(result, "quit", 4) == 0) {printf("result=%s,%d\n", result,strlen(result));break;}}}
客户端:
/*************************************************************************> File Name: file_client.c> Author: qinf> Mail: > Created Time: Sat 05 Apr 2014 09:40:28 AM CST ************************************************************************/#include "file_server.h"#define MAX_LEN 128#define OUT 0#define IN 1void cmd_handle(char *cmd, char *result);int main(int argc, char *argv[]){int client_fd, iret;struct sockaddr_in server_addr;memset(&server_addr, '\0', sizeof(server_addr));char cmd[128], result[128];char *filenames[MAX_LEN];char buf[128];char name[128];int num = 0, i = 0;int fd;//sockclient_fd = socket(AF_INET, SOCK_STREAM, 0);if (-1 == client_fd) {perror("socket");exit(EXIT_FAILURE);}//connectserver_addr.sin_family = AF_INET;server_addr.sin_port = htons(atoi(argv[2]));server_addr.sin_addr.s_addr = inet_addr(argv[1]);iret = connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));if (-1 == iret) {perror("connect");exit(EXIT_FAILURE);}//send recvwhile (1) {memset(cmd, '\0', 128);memset(result, '\0', 128);fgets(cmd, 128, stdin);printf("cmd=%s\n", cmd);cmd_handle(cmd, result);printf("result=%s\n", result);// iret = send(client_fd, cmd, strlen(cmd), 0);// if (-1 == iret) {// perror("send");// exit(EXIT_FAILURE);// }num = 0;if (strncmp(result, "ls", 2) == 0) {iret = send(client_fd, result, strlen(result), 0);if (-1 == iret) {perror("send");exit(EXIT_FAILURE);}filenames[num] = (char *)malloc(sizeof(char) * 128);memset(filenames[num], '\0', 128);int n, len;recv(client_fd, &n, sizeof(int), 0);printf("n=%d\n", n);n = 1;//while (--n >= 0) {if ((iret = recv(client_fd, filenames[num], 128, 0)) > 0) {//printf("%s\n", filenames[num]);printf("%s", filenames[num]);filenames[++num] = (char *)malloc(sizeof(char) * 128);memset(filenames[num], '\0', 128);}}} else if (strncmp(result, "remove", 6) == 0) {iret = send(client_fd, result, strlen(result), 0);if (-1 == iret) {perror("send");exit(EXIT_FAILURE);}recv(client_fd, result, 128, 0);printf("%s\n", result);} else if (strncmp(result, "get", 3) == 0) {// result[strlen(result) - 1] = '\0';iret = send(client_fd, result, strlen(result), 0);printf("----------result=%s\n", result);if (-1 == iret) {perror("send");exit(EXIT_FAILURE);}memset(name, '\0', 128);memset(buf, '\0', 128);printf("name=%s,len=%d\n", result, strlen(result));sprintf(name, "../%s", &result[4]);printf("new name=%s,len=%d\n", name, strlen(name));fd = open(name, O_WRONLY|O_CREAT, 0666);if (-1 == fd) {perror("open file");exit(EXIT_FAILURE);}//printf("==================\n");while((iret = recv(client_fd, buf, 128, 0)) > 0) {write(fd, buf, iret);memset(buf, '\0', 128);}close(fd);printf("file translate over!\n");} else if (strncmp(result, "put", 3) == 0) {off_t file_size;struct stat file_stat;memset(name, '\0', 128);memset(buf, '\0', 128);printf("result====%s\n", result);iret = send(client_fd, result, strlen(result), 0);//发送出错printf("name=%s,len=%d\n", result, strlen(result));sprintf(name, "%s", &result[4]);printf("new name=%s,len=%d\n", name, strlen(name));if (-1 == iret) {perror("send");exit(EXIT_FAILURE);}iret = stat(name, &file_stat);if (-1 == iret) {perror("stat");exit(EXIT_FAILURE);}file_size = file_stat.st_size;iret = send(client_fd, &file_size, sizeof(file_size), 0);if (-1 == iret) {perror("send");exit(EXIT_FAILURE);}fd = open(name, O_RDONLY);if (-1 == fd) {perror("open file");exit(EXIT_FAILURE);}while ((iret = read(fd, buf, 128)) > 0) {send(client_fd, buf, iret, 0);memset(buf, '\0', 128);}printf("put over!\n");} else if(strncmp(result, "quit", 4) == 0) {send(client_fd, result, strlen(result), 0);break;}}//close}void cmd_handle(char *cmd, char *result) {//flag用于去除命令行中间多个space,只保留一个空格,state = OUT代表当前字符为空格int i =0, j = 0, ch, state = OUT;//处理前置的spacewhile((ch = cmd[i++]) != EOF && ch != '\n' && ch != '\0') {if (ch == ' ' || ch == '\t') {if (state == IN) {state = OUT;result[j++] = ' ';}} else if (state == OUT) {state = IN;result[j++] = ch;} else {result[j++] = ch;}}result[j] = '\0';if (result[j-1] == '\t' || result[j - 1] == ' ')result[j-1] = '\0';}
0 0
- tcp实现简单的文件服务器(只能传文件)
- Go语言实现简单的文件服务器
- golang实现简单文件服务器
- 代码笔记 | 一个用python实现的简单的文件服务器
- 使用TCP套接字实现文件服务器
- TCP 文件服务器 (将服务器上的文件全部发给客户端)示例代码
- Ubuntu14.04实现简单日志文件服务器
- js访问文件服务器实现文件下载
- TCP扫描器的简单实现
- TCP扫描器的简单实现
- TCP连接的简单实现
- Tcp 实现简单的聊天
- 关于JS访问文件服务器的HTTP文件地址实现文件下载
- Keepalived+Nginx+FastDFS实现最简单的文件服务器的高可用
- Linux c实现一个tcp文件服务器和客户端
- 简单的go 静态文件服务器样例
- 使用nginx搭建简单的文件服务器
- 使用nginx搭建简单的文件服务器
- Android API Guides 之 App Manifest(14) - <path-permission>
- iReport专题学习之变量、栏05
- 线段树练习
- GNU系统下DL_POLY的编译
- ZOJ 3769 —— Diablo III(背包,DP)
- tcp实现简单的文件服务器(只能传文件)
- 2012淘宝笔试及答案
- Android API Guides 之 App Manifest(15) - <permission>
- linux下MySQL安装及设置
- Android API Guides 之 App Manifest(16) - <permission-group>
- c#常用知识点
- Android API Guides 之 App Manifest(17) - <permission-tree>
- [转贴] 黑鹰VIP破解教程和天草破解教程的内容整体整理 [复制链接] zhang3314 电梯直达楼主 发表于 2011-4-14 23:02 | 只看该作者 分享到:QQ空间微信腾讯
- 用汇编的眼光看C++(之判断流程)