




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、/*可以實現(xiàn)文件的傳送功能,且可以選擇存放的路徑,若該路徑有相同的文件名則詢問*是否需要更改存儲的文件名,如果需要則重新命名,否則退出。*20110908*/*外加實現(xiàn)多線程,即多個客戶端能同時傳送文件給服務(wù)器*2011-09-19*/服務(wù)器#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中的字節(jié)內(nèi)容寫入文件描述符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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 支架護(hù)坡施工方案
- 地面網(wǎng)格施工方案
- 礦井圍墻施工方案
- 工作績效評估方法3篇
- 小學(xué)生制定方式使用協(xié)議書3篇
- 全新定制衣柜質(zhì)保合同3篇
- 回款期對中小企業(yè)發(fā)展影響3篇
- 工程用塊石采購合同2篇
- 德國委托書翻譯認(rèn)證參考3篇
- 季度銷售工作總結(jié)(10篇)
- 商洛市寶恒礦業(yè)有限公司商洛市商州區(qū)東窯溝鉛鋅礦礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
- 腳手架詳細(xì)計算書
- 先導(dǎo)化合物的優(yōu)化課件
- 中學(xué)生心理危機(jī)識別與預(yù)防- 班主任技能培訓(xùn)課件
- 征信查詢委托書(共4篇)
- 銷售談判技巧課件
- PADI開放水域潛水員理論考試A卷
- golf高爾夫介紹課件
- 物業(yè)管理服務(wù)品質(zhì)檢查表
- 六年級下冊第五單元16表里的生物-表里的生物-學(xué)習(xí)任務(wù)單
- JJF 1318-2011 影像測量儀校準(zhǔn)規(guī)范-(高清現(xiàn)行)
評論
0/150
提交評論