




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、/*可以實(shí)現(xiàn)文件的傳送功能,且可以選擇存放的路徑,若該路徑有相同的文件名則詢(xún)問(wèn)*是否需要更改存儲(chǔ)的文件名,如果需要?jiǎng)t重新命名,否則退出。*20110908*/*外加實(shí)現(xiàn)多線程,即多個(gè)客戶(hù)端能同時(shí)傳送文件給服務(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)容寫(xiě)入文件描述符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;/客戶(hù)端#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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 神奇動(dòng)物面試題及答案
- 航空航天復(fù)合材料 課件第1章 知識(shí)點(diǎn)4 纖維(B纖維、C纖維)
- 音樂(lè)院校碩士考試試題及答案
- 增強(qiáng)在華留學(xué)生心理健康支持體系
- 中學(xué)思政教育
- 2025年中國(guó)男士夾克行業(yè)市場(chǎng)全景分析及前景機(jī)遇研判報(bào)告
- 影院場(chǎng)務(wù)培訓(xùn)
- 臺(tái)賬規(guī)范的培訓(xùn)
- 網(wǎng)絡(luò)安全防范培訓(xùn)
- 傳統(tǒng)文化元素與環(huán)境藝術(shù)設(shè)計(jì)的碰撞運(yùn)用
- 婦科急診常見(jiàn)病的課件
- 2022年呼倫貝爾職業(yè)技術(shù)學(xué)院輔導(dǎo)員招聘筆試題庫(kù)及答案解析
- 綠電制綠氫及其綜合利用技術(shù)PPT
- 各類(lèi)安全事故案例圖片合集
- 婚姻家庭咨詢(xún)師考試復(fù)習(xí)提綱
- [論文]黃土隧道洞身開(kāi)挖、支護(hù)施工技術(shù)
- 上海市學(xué)生健康促進(jìn)工程實(shí)施方案
- 實(shí)驗(yàn)室CNAS評(píng)審常見(jiàn)問(wèn)題精編要點(diǎn)
- 通信管道施工三級(jí)-安全技術(shù)交底記錄表
- 橋梁荷載試驗(yàn)
- 綜合布線報(bào)價(jià)清單范本
評(píng)論
0/150
提交評(píng)論