多客户端连接服务器传输文件_第1页
多客户端连接服务器传输文件_第2页
多客户端连接服务器传输文件_第3页
多客户端连接服务器传输文件_第4页
多客户端连接服务器传输文件_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论