




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/*可以实现文件的传送功能,且可以选择存放的路径,若该路径有相同的文件名则询问*是否需要更改存储的文件名,如果需要则重新命名,否则退出。*20110908*/*外加实现多线程,即多个客户端能同时传送文件给服务器*2011-09-19*/服务器#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <dirent.h>#include <string.h&
2、gt;#include <arpa/inet.h>#include <errno.h>#include <sys/types.h>#include <sys/wait.h>#include <signal.h>#include <fcntl.h>#include <pthread.h>#define LISTENQ20#define MAXLINE40#define BUFFERSIZE4096#define PORT3336/*将buf中的字节内容写入文件描述符fd*/ssize_t writen(int f
3、d, const void * vptr, size_t n)size_tnleft;ssize_t nwritten;const char * ptr;ptr = vptr;nleft = n;while ( nleft > 0) /start to writeif (nwritten = write(fd, ptr, nleft) <= 0)if (nwritten < 0 && errno = EINTR) /interupt errornwritten = 0;elsereturn -1;nleft -= nwritten;ptr += nwritte
4、n; /continue to write from the leftreturn 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);elseif (errno = EINT
5、R)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 errorn");exit(1);return sockfd;int Accept(int sockfd, struct sockaddr * addr, socklen_t * addrlen)int ret;if (ret
6、 = accept(sockfd, addr, addrlen) < 0)fprintf(stderr, "accept errorn");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 errorn");exit(1);return ret;int Listen(int so
7、ckfd, int backlog)int ret;if (ret = listen(sockfd, backlog) < 0)fprintf(stderr, "listen errorn");exit(1);return ret;int Close(int fd)int ret;if (ret = close(fd) < 0)fprintf(stderr, "close errorn");exit(1);return ret;void *create_thread(int connfd)charbuffBUFFERSIZE + 1;char
8、filenameBUFFERSIZE + 1;charcdBUFFERSIZE+1;intfilefd; /* file descriptor */intcount;DIR*dir;struct dirent*ptr;charchoose10;printf("readinging filename.n");if (readline(connfd, buff, BUFFERSIZE) < 0)fprintf(stderr, "readline errorn");exit(1);buffstrlen(buff) - 1 = 0; /* change &
9、#39;n' to NUL */memcpy(filename, buff, BUFFERSIZE + 1);printf("will save to file: %sn", buff);/change the direct to store the fileprintf("Input the direct you want to store %s:n", buff);scanf("%s", cd);if(chdir(cd) < 0)fprintf(stderr, "direct errorn");e
10、xit(1);/judge whether have the filename or notdir = opendir(cd);while(ptr = readdir(dir) != NULL)if(strcmp(buff, ptr->d_name) = 0)printf("Already have the %sn", buff);printf("If you want to rename, please input 'yes', or you can input 'no'n");scanf("%s&quo
11、t;, choose);if(strcmp(choose, "yes") = 0)printf("You can rename:t");scanf("%s", buff);elseprintf("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: %sn", b
12、uff);exit(1);printf("which thread is %dn",connfd);while(count = read(connfd, buff, BUFFERSIZE)if (count < 0)fprintf(stderr, "connfd read errorn");exit(1);if (writen(filefd, buff, count) < 0) fprintf(stderr, "writing to filefd errorn");exit(1);closedir(dir);Close(f
13、ilefd);Close(connfd);printf("file %s received!n", filename);int main()intlistenfd, connfdFD_MAX,i = 0,j;charbuffBUFFERSIZE + 1;charfilenameBUFFERSIZE + 1;charcdBUFFERSIZE+1;charchoose10;struct sockaddr_inservaddr, cliaddr;intcliaddrlen;intfilefd; /* file descriptor */DIR*dir;struct dirent*
14、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);pthread_tchild_thread;p
15、thread_attr_tchild_thread_attr;pthread_attr_setdetachstate(&child_thread_attr,PTHREAD_CREATE_DETACHED);/while(1)printf("listening.n");cliaddrlen = sizeof(cliaddr);printf("i is %d n", i);connfdi = Accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddrlen);if(pthread_cr
16、eate(&child_thread,&child_thread_attr,create_thread,(void *)connfdi)<0)printf("pthread_create Failed:%sn",strerror(errno);i+;Close(listenfd);pthread_attr_destroy(&child_thread_attr); pthread_exit (NULL);return 0;/客户端#include <stdio.h>#include <stdlib.h>#include &
17、lt;unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>#include <arpa/inet.h>#include <errno.h>#include <sys/types.h>#include <sys/wait.h>#include <signal.h>#include <fcntl.h>#define LISTENQ 20#define MAXLINE 40#define BU
18、FFERSIZE 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 -= n
19、written;ptr += nwritten;return n;int Socket(int domain, int type, int protocol)int sockfd;if (sockfd = socket(domain, type, protocol) < 0) fprintf(stderr, "socket errorn");exit(1);return sockfd;int Connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)int ret;if (ret = conn
20、ect(sockfd, addr, addrlen) < 0) fprintf(stderr, "connect errorn");exit(1);return ret;int Close(int fd)int ret;if (ret = close(fd) < 0) fprintf(stderr, "close errorn");exit(1);return ret;int main(int argc, char *argv)if (argc != 3) fprintf(stderr, "Usage: ./fileclient &
21、lt;file> <serverIP>n");exit(1);int sockfd;char buffBUFFERSIZE + 1;char filenameheaderBUFFERSIZE + 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);pr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025建筑工程项目承包经营合同范本
- 农业科技创新成果转化合作合同
- 土地流转变更及农业生产责任协议
- 静脉曲张护理试题及答案
- 2025年湖南高速养护工程有限公司第二批招聘46人笔试参考题库附带答案详解
- 纺织行业的技术进步研究试题及答案
- 细致备考国际商业美术设计师试题及答案
- 政府订餐合同协议书
- 幼儿园双股份合同协议书
- 修车合同协议书怎么写
- 无锡鼋头渚课件
- 管道工技师理论知识题库及答案(完整版)
- JCP-200磁控溅射蒸发镀膜机 使用说明书
- 各类安全事故案例图片合集
- 通信原理1抽样定理课件
- 高空坠落事故专项应急救援预案
- TCWAN 0027-2022 TCEEIA 584-2022 新能源汽车铝合金电池托盘焊接制造规范
- 中国历史地理概论课件
- 顶管工程竣工验收报告
- 基于UC3842的反激式开关电源的设计
- 生态防护林建设项目建议书范文
评论
0/150
提交评论