ftp文件收发代码
来源:互联网 发布:开源三网合一源码 编辑:程序博客网 时间:2024/05/01 15:32
server:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include <dirent.h>#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <errno.h>#define N 128typedef struct sockaddr SA;void ProcessList(int connfd){char buf[N];DIR *mydir;struct dirent *myitem;mydir = opendir(".");while ((myitem = readdir(mydir)) != NULL){if ((strcmp(myitem->d_name, ".") == 0) || (strcmp(myitem->d_name, "..") == 0)) continue;strcpy(buf, myitem->d_name);send(connfd, buf, N, 0);}closedir(mydir);return;}void ProcessGet(int connfd, char buf[]){int fd, nbyte;if ((fd = open(buf+1, O_RDONLY)) < 0){fprintf(stderr, "fail to open %s : %s\n", buf+1, strerror(errno));buf[0] = 'N';send(connfd, buf, N, 0);return;}buf[0] = 'Y';send(connfd, buf, N, 0);while ((nbyte = read(fd, buf, N)) > 0){send(connfd, buf, nbyte, 0);}close(fd);return;}void ProcessPut(int connfd, char buf[]){int fd, nbyte;if ((fd = open(buf+1, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0){printf("fail to create %s on server\n", buf+1);return;}while ((nbyte = recv(connfd, buf, N, 0)) > 0){write(fd, buf, nbyte);}close(fd);return;}int main(int argc, char *argv[]){ int listenfd, connfd;char buf[N]; struct sockaddr_in server_addr; // XXX:step 1 int socket(int domain, int type, int protocol); if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { fprintf(stderr, "fail to socket : %s\n", strerror(errno)); exit(-1); }#ifdef _DEBUG_ printf("socket is %d\n", listenfd);#endif // XXX:step 2 int bind(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = PF_INET; server_addr.sin_port = htons(8888); server_addr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(listenfd, (SA *)&server_addr, sizeof(server_addr)) < 0){perror("fail to bind");exit(-1);}listen(listenfd, 5); while ( 1 ){if ((connfd = accept(listenfd, NULL, NULL)) < 0){perror("fail to accept");break;}recv(connfd, buf, N, 0);switch (buf[0]){case 'L' :ProcessList(connfd);break;case 'G' :ProcessGet(connfd, buf);break;case 'P' :ProcessPut(connfd, buf);break;}close(connfd);} return 0;}
client:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <errno.h>#define N 128typedef struct sockaddr SA;void PrintHelp(){ printf("help : display help info\n"); printf("list : get file list of server\n"); printf("get : get <file>\n"); printf("put : put <file>\n");printf("quit : quit the client\n");return;}void ProcessList(struct sockaddr_in server_addr){ int sockfd, nbyte;char buf[N];if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0){ printf("fail to list\n");return;}if (connect(sockfd, (SA *)&server_addr, sizeof(server_addr)) < 0) { printf("fail to connect server\n");goto ERROR_1; }strcpy(buf, "L");send(sockfd, buf, N, 0); while ((nbyte = recv(sockfd, buf, N, 0)) != 0){printf("%s\n", buf);}ERROR_1:close(sockfd); return;}void ProcessGet(struct sockaddr_in server_addr, char command[]){int sockfd, nbyte, fd; char buf[N];if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0){ printf("fail to get\n");return;}if (connect(sockfd, (SA *)&server_addr, sizeof(server_addr)) < 0) { printf("fail to connect server\n");goto ERROR_2; }sprintf(buf, "G%s", command+4);send(sockfd, buf, N, 0); recv(sockfd, buf, N, 0);if (buf[0] == 'N') // no such file{printf("No such file on server\n");goto ERROR_2;} if ((fd = open(command+4, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0){ printf("fail to create local file %s\n", command+4);goto ERROR_2;} while ((nbyte = recv(sockfd, buf, N, 0)) > 0){write(fd, buf, nbyte);}close(fd);ERROR_2:close(sockfd);return;}void ProcessPut(struct sockaddr_in server_addr, char command[]){int sockfd, fd, nbyte;char buf[N]; if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0){ printf("fail to get\n");return;}if (connect(sockfd, (SA *)&server_addr, sizeof(server_addr)) < 0) { printf("fail to connect server\n");goto ERROR_3; } if ((fd = open(command+4, O_RDONLY)) < 0){printf("fail to open %s\n", command+4);goto ERROR_3;} sprintf(buf, "P%s", command+4);send(sockfd, buf, N, 0);while ((nbyte = read(fd, buf, N)) > 0){send(sockfd, buf, nbyte, 0);}close(fd);ERROR_3:close(sockfd);return;}int main(int argc, char *argv[]){ int sockfd, fd, nbyte; char command[32]; struct sockaddr_in server_addr; if (argc < 3){printf("Usage : %s <server_ip> : <port>\n", argv[0]);exit(-1);} // XXX:step 1 int socket(int domain, int type, int protocol); if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { fprintf(stderr, "fail to socket : %s\n", strerror(errno)); exit(-1); }#ifdef _DEBUG_ printf("socket is %d\n", sockfd);#endif // XXX:step 2 int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = PF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); //server_addr.sin_addr.s_addr = htonl(INADDR_ANY); while ( 1 ){ printf("<client> ");fgets(command, 32, stdin);command[strlen(command)-1] = '\0'; // overwrite the '\n' if (strcmp(command, "help") == 0){ PrintHelp();}else if (strcmp(command, "list") == 0){ProcessList(server_addr);}else if (strncmp(command, "get ", 4) == 0){ProcessGet(server_addr, command);}else if (strncmp(command, "put ", 4) == 0){ProcessPut(server_addr, command);}else if (strcmp(command, "quit") == 0){printf("Bye\n");break;}else{printf("wrong command, 'help' for command list\n");}} return 0;}
0 0
- ftp文件收发代码
- python ftp上传文件代码
- FTP批量下载文件代码
- python ftp上传文件代码
- ftp取文件 代码 测试
- python ftp上传文件代码
- FTP 传输文件后台代码
- Java FTP上传下载单个文件示例代码
- C# FTP上传文件至服务器代码
- C# FTP上传文件至服务器代码
- C# FTP上传文件至服务器代码
- java 代码之FTP服务器下载文件
- C# FTP上传文件至服务器代码
- JAVA代码实现FTP文件下载
- FTP上传文件失败提示451代码
- Java代码实现FTP文件下载
- JAVA代码实现FTP文件下载
- 使用ftp上传文件代码解析
- 获取手机信息,型号,版本等
- JavaMail 发送Email(含附件)
- txt格式的文件转换成pdf的转换方法
- 初探swift语言的学习笔记九(OC与Swift混编)
- 一个人的战斗
- ftp文件收发代码
- 使用Navicat For MySql 将mysql中的数据导出
- svn: E000017: Can't create directory '/home/cmcc/.svn/tmp': File exists
- GO备忘录
- [刷题]Majority Number II
- android:layout_gravity
- OpenGL和Mesa的关系
- Eclipse 搭建PhoneGap 开发环境
- Android自定义控件的好处