linux读文件整个过程,linux下文件资料传输实现全过程

62e50291a81fc54b507f33cb80033297.gif linux下文件资料传输实现全过程

(8页)

8345d20ed311695e6bc835671551f7d2.gif

本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!

17.90 积分

实用标准文案/************************************************************************************************可以实现文件的传送功能,且可以选择存放的路径,若该路径有相同的文件名则询问*是否需要更改存储的文件名,如果需要则重新命名,否则退出。**2011-09-08*************************************************************************************************///服务器server.c#include #include #include #include #include #include #include #include #include #include #include #include #include #define LISTENQ 20#define MAXLINE 40#define BUFFERSIZE 4096#define PORT 3336/*将buf中的字节内容写入文件描述符fd*/ssize_t writen(int fd, const void * vptr, size_t n){ size_t nleft; ssize_t nwritten; const char * ptr; ptr = vptr; nleft = n; while ( nleft > 0) { //start to write if ((nwritten = write(fd, ptr, nleft)) <= 0) { if (nwritten < 0 && errno == EINTR) //interupt error { nwritten = 0; } else { return -1; } } nleft -= nwritten; ptr += nwritten; //continue to write from the left } return n;}ssize_t readline(int fd, void * vptr, size_t maxlen){ ssize_t n, rc; char c, *ptr; ptr = vptr; for (n = 1; n < maxlen; n++) { again: if ((rc = read(fd, &c, 1)) == 1) { *ptr++ = c; if (c == '\n') { break; } } else if (rc == 0) { *ptr = 0; return (n - 1); } else { if (errno == EINTR) { goto again; } return (-1); } } *ptr = 0; return (n);}int Socket(int domain, int type, int protocol){ int sockfd; if ((sockfd = socket(domain, type, protocol)) < 0) { fprintf(stderr, "socket error\n"); exit(1); } return sockfd;}int Accept(int sockfd, struct sockaddr * addr, socklen_t * addrlen){ int ret; if ((ret = accept(sockfd, addr, addrlen)) < 0) { fprintf(stderr, "accept error\n"); exit(1); } return ret;}int Bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen){ int ret; if ((ret = bind(sockfd, addr, addrlen)) < 0) { fprintf(stderr, "bind error\n"); exit(1); } return ret;}int Listen(int sockfd, int backlog){ int ret; if ((ret = listen(sockfd, backlog)) < 0) { fprintf(stderr, "listen error\n"); exit(1); } return ret;}int Close(int fd){ int ret; if ((ret = close(fd)) < 0) { fprintf(stderr, "close error\n"); exit(1); } return ret;}int main(void){ int listenfd, connfd; char buff[BUFFERSIZE + 1]; char filename[BUFFERSIZE + 1]; char cd[BUFFERSIZE+1]; char choose[10]; struct sockaddr_in servaddr, cliaddr; int cliaddrlen; int filefd; /* file descriptor */ int count; DIR *dir; struct dirent *ptr; listenfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; servaddr.sin_port = htons(PORT); Bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); Listen(listenfd, LISTENQ); // while(1) { printf("listening........\n"); cliaddrlen = sizeof(cliaddr); connfd = Accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddrlen); printf("readinging filename........\n"); if (readline(connfd, buff, BUFFERSIZE) < 0) { fprintf(stderr, "readline error\n"); exit(1); } buff[strlen(buff) - 1] = 0; /* change '\n' to NUL */ memcpy(filename, buff, BUFFERSIZE + 1); printf("will save to file: %s\n", buff); //change the direct to store the file printf("Input the direct you want to store %s:\n", buff); scanf("%s", cd); if(chdir(cd) < 0) { fprintf(stderr, "direct error\n"); exit(1); } //judge whether have the filename or not dir = opendir(cd); while((ptr = readdir(dir)) != NULL) { if(strcmp(buff, ptr->d_name) == 0) { printf("Already have the %s\n", buff); printf("If you want to rename, please input 'yes', or you can input 'no'\n"); scanf("%s", choose); if(strcmp(choose, "yes") == 0) { printf("You can rename:\t"); scanf("%s", buff); } else { printf("Already have the file, now exit!\n"); exit (1); } } } filefd = open(buff, O_WRONLY | O_CREAT); if (filefd < 0) { fprintf(stderr, "can't open the file: %s\n", buff); exit(1); } while(count = read(connfd, buff, BUFFERSIZE)) { if (count < 0) { fprintf(stderr, "connfd read error\n"); exit(1); } if (writen(filefd, buff, count) < 0) { fprintf(stderr, "writing to filefd error\n"); exit(1); } } closedir(dir); Close(filefd); Close(connfd); printf("file %s received!\n", filename); } Close(listenfd); return 0;}客户端#include #include #include #include #include #include #include #include #include #include #include #include #define LISTENQ 20#define MAXLINE 40#define BUFFERSIZE 4096#define PORT 3336ssize_t writen(int fd, const void * vptr, size_t n){ size_t nleft; ssize_t nwritten; const char * ptr; ptr = vptr; nleft = n; while (nleft > 0) { if ((nwritten = write(fd, ptr, nleft)) <= 0) { if (nwritten < 0 && errno == EINTR) { nwritten = 0; } else { return -1; } } nleft -= nwritten; ptr += nwritten; } return n;}int Socket(int domain, int type, int protocol){ int sockfd; if ((sockfd = socket(domain, type, protocol)) < 0) { fprintf(stderr, "socket error\n"); exit(1); } return sockfd;}int Connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen){ int ret; if ((ret = connect(sockfd, addr, addrlen)) < 0) { fprintf(stderr, "connect error\n"); exit(1); } return ret;}int Close(int fd){ int ret; if ((ret = close(fd)) < 0) { fprintf(stderr, "close error\n"); exit(1); } return ret;}int main(int argc, char *argv[]){ if (argc != 3) { fprintf(stderr, "Usage: ./fileclient \n"); exit(1); } int sockfd; char buff[BUFFERSIZE + 1]; char filenameheader[BUFFERSIZE + 1]; struct sockaddr_in servaddr; int filefd; /* file descriptor */ int count; sockfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr=INADDR_ANY; servaddr.sin_port = htons(PORT); printf("connecting........\n"); Connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); printf("transferring file name: %s........\n", argv[1]); memcpy(filenameheader, argv[1], strlen(argv[1])); filenameheader[strlen(argv[1])] = '\n'; filenameheader[strlen(argv[1]) + 1] = 0; writen(sockfd, filenameheader, strlen(filenameheader)); printf("will transfer file: %s\n", argv[1]); filefd = open(argv[1], O_RDONLY); if (filefd < 0) { fprintf(stderr, "can't open the file: %s\n", argv[1]); exit(1); } while(count = read(filefd, buff, BUFFERSIZE)) { if (count < 0) { fprintf(stderr, "filefd read error\n"); exit(1); } if (writen(sockfd, buff, count) < 0) { fprintf(stderr, "writing to sockfd error\n"); exit(1); } } Close(filefd); Close(sockfd); printf("file %s already transferred!\n", argv[1]); return 0;}精彩文档 关 键 词: linux 文件 资料 传输 实现 全过程

524d6daf746efaa52c3c71bbfe7ba172.gif  天天文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值