




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、/*可以實(shí)現(xiàn)文件的傳送功能,且可以選擇存放的路徑,若該路徑有相同的文件名則詢問(wèn)*是否需要更改存儲(chǔ)的文件名,如果需要?jiǎng)t重新命名,否則退出。*20110908*/*外加實(shí)現(xiàn)多線程,即多個(gè)客戶端能同時(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;/客戶端#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)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 互聯(lián)網(wǎng)金融平臺(tái)合規(guī)整改關(guān)鍵指標(biāo)與2025年可持續(xù)發(fā)展評(píng)估報(bào)告
- 貴州省銅仁市萬(wàn)山區(qū)2024-2025學(xué)年部編版七年級(jí)下學(xué)期6月期末歷史試題(含答案)
- 安徽省合肥市興國(guó)實(shí)驗(yàn)學(xué)校2024~2025學(xué)年度八年級(jí)下學(xué)期期末物理試卷(含答案)
- 優(yōu)信車(chē)況培訓(xùn)
- 剪板折彎安全操作規(guī)程培訓(xùn)
- 自考比較學(xué)前教育
- 5Why原因分析方法培訓(xùn)
- 股指期貨基礎(chǔ)培訓(xùn)課件
- 腫瘤病人預(yù)防血栓健康宣教
- 美術(shù)美味的冰激凌
- 2025年高考全國(guó)二卷數(shù)學(xué)高考真題解析 含參考答案
- 2025年日歷表全年(打印版)完整清新每月一張
- 國(guó)開(kāi)經(jīng)濟(jì)學(xué)(本)1-14章練習(xí)試題及答案
- 婚姻家庭咨詢師考試復(fù)習(xí)提綱
- [論文]黃土隧道洞身開(kāi)挖、支護(hù)施工技術(shù)
- 上海市學(xué)生健康促進(jìn)工程實(shí)施方案
- 實(shí)驗(yàn)室CNAS評(píng)審常見(jiàn)問(wèn)題精編要點(diǎn)
- 動(dòng)火安全作業(yè)票填寫(xiě)模板2022年更新
- 通信管道施工三級(jí)-安全技術(shù)交底記錄表
- 橋梁荷載試驗(yàn)
- 綜合布線報(bào)價(jià)清單范本
評(píng)論
0/150
提交評(píng)論