linux网络编程——TCP文件服务器
2012-08-19 12:22
281 查看
程序功能:
客户端能够通过命令显示文件服务器上的文件,能够上传、下载文件等等功能;
程序如下:
(1)、server.c
客户端能够通过命令显示文件服务器上的文件,能够上传、下载文件等等功能;
程序如下:
(1)、server.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/socket.h> #include <dirent.h> #include <fcntl.h> struct message { char cmd[10]; char filename[20]; }; void list_file(int , struct message *); void get_file(int , struct message *); void put_file(int , struct message *); int main(int argc, const char *argv[]) { int listen_fd, socket_fd; struct sockaddr_in server_addr, client_addr; int client_addrlen; struct message msg; if (argc < 3) { fprintf(stderr, "usages : %s ip port\n", argv[0]); exit(-1); } if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("failed to create socket"); exit(-1); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); client_addrlen = sizeof(struct sockaddr); if (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("failed to bind"); exit(-1); } listen(listen_fd, 5); while(1) { if ((socket_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &client_addrlen)) < 0) { perror("failed to accept"); exit(-1); } memset(&msg, 0, sizeof(msg)); recv(socket_fd, &msg, sizeof(msg), 0); printf("cmd : %s\n", msg.cmd); if (strcmp(msg.cmd, "list") == 0) list_file(socket_fd, &msg); if (strcmp(msg.cmd, "get") == 0) get_file(socket_fd, &msg); if (strcmp(msg.cmd, "put") == 0) put_file(socket_fd, &msg); } return 0; } void list_file(int socket_fd, struct message *msg) { DIR *dir; struct dirent *dp; char buf[100]; if ((dir = opendir(".")) < 0) { perror("failed to open dir"); exit(-1); } memset(buf, 0, sizeof(buf)); while ((dp = readdir(dir)) != NULL) { if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0) continue; strcat(buf, dp->d_name); strcat(buf, " "); } send(socket_fd, buf, strlen(buf) + 1, 0); close(socket_fd); return ; } void get_file(int socket_fd, struct message *msg) { int fd; char buf[1024]; int num = 0; if ((fd = open(msg->filename, O_RDONLY)) < 0) { perror("failed to open file"); exit(-1); } memset(buf, 0, sizeof(buf)); while((num = read(fd, buf, sizeof(buf))) > 0) { usleep(500); send(socket_fd, buf, num, 0); } close(fd); close(socket_fd); return ; } void put_file(int socket_fd, struct message *msg) { int fd; char buf[1024]; int num = 0; if ((fd = open(msg->filename, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) { perror("failed to create file"); exit(-1); } memset(buf, 0, sizeof(buf)); while((num = recv(socket_fd, buf, sizeof(buf), 0)) > 0) write(fd, buf, num); close(fd); close(socket_fd); return ; }(2)client.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/socket.h> #include <dirent.h> #include <fcntl.h> struct message { char cmd[10]; char filename[20]; }; void list_file(struct message , char *, struct sockaddr_in); void get_file(struct message , char *, char *, struct sockaddr_in); void put_file(struct message , char *, char *, struct sockaddr_in); int main(int argc, const char *argv[]) { struct sockaddr_in server_addr; struct message msg; char buf[100]; char *arg[10]; int i = 0; if (argc < 3) { fprintf(stderr, "usages: %s ip port\n", argv[0]); exit(-1); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); while (1) { memset(buf, 0, sizeof(buf)); memset(&msg, 0, sizeof(msg)); i = 0; printf("##################################\n"); printf("function:\n"); printf("Input \"list\" can list the file server's files\n"); printf("Input \"get filename\" can download file from file server\n"); printf("Input \"put filename\" can upload file to file server\n"); printf("Input \"quit\" can quit the client\n"); printf("##################################\n"); printf(">"); fgets(buf, sizeof(buf), stdin); buf[strlen(buf) - 1] = 0; if (strncmp(buf, "quit", 4) == 0) break; arg[i] = strtok(buf, " "); while(arg[i] != NULL) arg[++i] = strtok(NULL, " "); if (strcmp(arg[0], "list") == 0) list_file(msg, arg[0], server_addr); else if (strcmp(arg[0], "get") == 0) get_file(msg, arg[0], arg[1], server_addr); else if (strcmp(arg[0], "put") == 0) put_file(msg, arg[0], arg[1], server_addr); } return 0; } void list_file(struct message msg, char *cmd, struct sockaddr_in server_addr) { char buf[100]; int server_fd; if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("failed to create socket"); exit(-1); } if (connect(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("failed to connect"); exit(-1); } strcpy(msg.cmd, cmd); send(server_fd, &msg, sizeof(msg), 0); usleep(500); memset(buf, 0, sizeof(buf)); recv(server_fd, buf, sizeof(buf), 0); printf("%s\n", buf); close(server_fd); return ; } void get_file(struct message msg, char *cmd, char *filename, struct sockaddr_in server_addr) { int fd; int server_fd; char buf[1024]; int num = 0; if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("failed to create socket"); exit(-1); } if (connect(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("failed to connect"); exit(-1); } if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) { perror("failed to create file"); exit(-1); } strcpy(msg.cmd, cmd); strcpy(msg.filename, filename); send(server_fd, &msg, sizeof(msg), 0); memset(buf, 0, sizeof(buf)); while ((num = recv(server_fd, buf, sizeof(buf), 0)) > 0) { usleep(500); write(fd, buf, num); memset(buf, 0, sizeof(buf)); } printf("DownLoad OK!\n"); close(fd); close(server_fd); return ; } void put_file(struct message msg, char *cmd, char *filename, struct sockaddr_in server_addr) { int fd; int server_fd; int num = 0; char buf[1024]; if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("failed to create socket"); exit(-1); } if (connect(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("failed to connect"); exit(-1); } strcpy(msg.cmd, cmd); strcpy(msg.filename, filename); send(server_fd, &msg, sizeof(msg), 0); usleep(500); if ((fd = open(filename, O_RDONLY)) < 0) { perror("failed to open file"); exit(-1); } memset(buf, 0, sizeof(buf)); while ((num = read(fd, buf, sizeof(buf))) > 0) send(server_fd, buf, num, 0); printf("UpLoad OK!\n"); close(fd); close(server_fd); return ; }
相关文章推荐
- Linux网络编程6——使用TCP实现文件服务器
- Linux网络编程【五】:TCP协议高性能服务器(http)模型之I/O多路转接select
- Linux网络编程——TCP服务器
- 基于TCP网络通信的自动升级程序源码分析-服务器发送文件
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- 使用TCP套接字实现文件服务器
- Linux网络编程 5 - select模式的TCP服务器
- Linux网络编程(2)简单的TCP回射服务器(Echo Server)
- linux 网络编程 Tcp文件服务器
- Linux网络编程:TCP服务器(单进程多用户),使用select方法实现
- Android TCP 文件客户端与服务器DEMO介绍
- Android TCP 文件客户端与服务器DEMO
- Linux网络编程一步一步学-自己编写一个HTTP协议的目录浏览和文件下载服务器
- Linux网络编程——tcp并发服务器(poll实现)
- QT TCP文件上传服务器
- Linux c实现一个tcp文件服务器和客户端
- 网络编程(tcp文件服务器)
- QT编写多线程TCP文件接收服务器
- Linux网络编程——tcp并发服务器(I/O复用之select)
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)