版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 網(wǎng)絡(luò)程序設(shè)計(jì)</b></p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 第1章 課程設(shè)計(jì)目的、要求</p><p><b> 1.1課程設(shè)計(jì)目的</b></p><p> 1.熟練掌握所學(xué)到的網(wǎng)絡(luò)套接字函數(shù)。</p&g
2、t;<p> 2.掌握UDP和TCP編程關(guān)鍵函數(shù)。</p><p> 3.掌握多進(jìn)程或多線程編程。</p><p> 4.掌握使用select實(shí)現(xiàn)I/O復(fù)用。</p><p> 5.掌握守護(hù)進(jìn)程的編寫(xiě)。</p><p><b> 1.2實(shí)驗(yàn)要求</b></p><p>
3、1.認(rèn)真閱讀和掌握本實(shí)驗(yàn)的相關(guān)的知識(shí)點(diǎn)。</p><p> 2.上機(jī)編寫(xiě)并運(yùn)行程序。</p><p><b> 1.3實(shí)驗(yàn)內(nèi)容</b></p><p> 實(shí)現(xiàn)一個(gè)并發(fā)、IO復(fù)用的守護(hù)進(jìn)程時(shí)間服務(wù)器,要求當(dāng)客戶端向服務(wù)器發(fā)送“what’s time?”字符串時(shí),服務(wù)器回應(yīng)當(dāng)時(shí)的系統(tǒng)時(shí)間字符串。</p><p><
4、;b> 1.4小組分工</b></p><p> 第2章 課程設(shè)計(jì)分析及內(nèi)容</p><p><b> 2.1所用知識(shí)點(diǎn)</b></p><p> 2.1.1套接字函數(shù)</p><p> ?、倏蛻舳怂煤瘮?shù):socket()函數(shù)、connect()函數(shù)、send()函數(shù)、recv()函數(shù),clo
5、se()函數(shù)。</p><p> ?、诜?wù)器端所用函數(shù):bind()函數(shù)、socket()函數(shù)、listen()函數(shù)、accept()函數(shù)、send()函數(shù)、accept()函數(shù)、recv()函數(shù)、close()函數(shù)。</p><p><b> 2.1.2守護(hù)進(jìn)程</b></p><p> 守護(hù)進(jìn)程,也就是通常說(shuō)的Daemon進(jìn)程,是Lin
6、ux中的后臺(tái)服務(wù)進(jìn)程。它是一個(gè)生存期較長(zhǎng)的進(jìn)程,通常獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。守護(hù)進(jìn)程常常在系統(tǒng)引導(dǎo)裝入時(shí)啟動(dòng),在系統(tǒng)關(guān)閉時(shí)終止。Linux系統(tǒng)有很多守護(hù)進(jìn)程,大多數(shù)服務(wù)都是通過(guò)守護(hù)進(jìn)程實(shí)現(xiàn)的。</p><p> 每一個(gè)從此終端開(kāi)始運(yùn)行的進(jìn)程都會(huì)依附于這個(gè)終端,這個(gè)終端就稱為這些進(jìn)程的控制終端,當(dāng)控制終端被關(guān)閉時(shí),相應(yīng)的進(jìn)程都會(huì)自動(dòng)關(guān)閉。但是守護(hù)進(jìn)程卻能夠突破這種限制,它從
7、被執(zhí)行開(kāi)始運(yùn)轉(zhuǎn),直到整個(gè)系統(tǒng)關(guān)閉時(shí)才退出。如果想讓某個(gè)進(jìn)程不因?yàn)橛脩艋蚪K端或其他地變化而受到影響,那么就必須把這個(gè)進(jìn)程變成一個(gè)守護(hù)進(jìn)程。</p><p> 2.1.3 I/O復(fù)用</p><p> I/O復(fù)用調(diào)用select或poll,并在該函數(shù)上阻塞,等待數(shù)據(jù)報(bào)套接口可讀;當(dāng)select返回可讀條件時(shí),調(diào)用recvfrom將數(shù)據(jù)報(bào)拷貝到應(yīng)用程序緩沖區(qū)中。</p><
8、;p><b> 主要應(yīng)用:</b></p><p> ?。?)客戶程序需要同時(shí)處理交互式的輸入和服務(wù)器之間的網(wǎng)絡(luò)連接。</p><p> ?。?)客戶端需要對(duì)多個(gè)網(wǎng)絡(luò)連接作出反應(yīng)。</p><p> ?。?)TCP服務(wù)器需要同時(shí)處理多個(gè)處于監(jiān)聽(tīng)狀態(tài)和多個(gè)連接狀態(tài)的套接字。</p><p> ?。?)服務(wù)器需要處理
9、多個(gè)網(wǎng)絡(luò)協(xié)議的套接字。</p><p> (5)服務(wù)器需要同時(shí)處理不同的網(wǎng)絡(luò)服務(wù)和協(xié)議。</p><p> 2.1.4 并發(fā)服務(wù)器</p><p> 不同于順序服務(wù)器,并發(fā)服務(wù)器就要能在一個(gè)時(shí)間為多個(gè)客戶端提供服務(wù)。 例如,一個(gè)聊天服務(wù)器可能服務(wù)一個(gè)特定的客戶端數(shù)小時(shí)──在停止為這個(gè)客戶端服務(wù)之前服務(wù)器不能等待, 除非是在等待一下個(gè)客戶端到來(lái)之前的間隙才能等待
10、。</p><p> 第3章 課程設(shè)計(jì)的實(shí)現(xiàn)</p><p> 3.1 程序運(yùn)行步驟</p><p> 對(duì)于服務(wù)器端而言,由于它是一個(gè)守護(hù)進(jìn)程所以只要做到接收信息并且存儲(chǔ)在一個(gè)數(shù)組中即可而不必在前臺(tái)顯示,對(duì)于客戶端必須有信息的發(fā)送和接收。服務(wù)器端必須對(duì)來(lái)自客戶端的信息加以判斷。</p><p> 如果接收到的字符串與“what’s_
11、time?”字符串行匹配那么則返回給客戶端一個(gè)系統(tǒng)的時(shí)間信息,否則返回給客戶端“Input error”的字符串。</p><p><b> 如下圖所示:</b></p><p><b> 圖3-1連接流程圖</b></p><p> 3.2 客戶端主要函數(shù)</p><p> 3.2.1 s
12、ocket()函數(shù)</p><p> socket()函數(shù)用于根據(jù)指定的地址族、數(shù)據(jù)類型和協(xié)議來(lái)分配一個(gè)套接口的描述字及其所用的資源。</p><p> 創(chuàng)建一個(gè)套接口,代碼如下: </p><p> #include <winsock.h> </p><p> SOCKET PASCAL FAR socket( int
13、af, int type, int protocol); </p><p> Af是一個(gè)地址描述。目前僅支持AF_INET格式,也就是說(shuō)ARPA Internet地址格式,Type是新套接口的類型描述,protocol:套接口所用的協(xié)議,如調(diào)用者不想指定,可用0指定,表示缺省。</p><p> 3.2.2 connect()函數(shù)</p><p> 本函數(shù)用于
14、創(chuàng)建與指定外部端口的連接。s參數(shù)指定一個(gè)未連接的數(shù)據(jù)報(bào)或流類套接口。如套接口未被捆綁,則系統(tǒng)賦給本地關(guān)聯(lián)一個(gè)唯一的值,且設(shè)置套接口為已捆綁。請(qǐng)注意若名字結(jié)構(gòu)中的地址域?yàn)槿愕脑?,則connect()將返回WSAEADDRNOTAVAIL錯(cuò)誤。</p><p> 返回值:若無(wú)錯(cuò)誤發(fā)生,則connect()返回0。否則的話,返SOCKET_ERROR錯(cuò)誤,應(yīng)用程序可通過(guò)WSAGetLastError()獲取相應(yīng)錯(cuò)誤
15、代碼。</p><p> 創(chuàng)建一個(gè)連接,代碼如下:</p><p> #include <winsock.h> //調(diào)用套接字</p><p> int PASCAL FAR connect( SOCKET s, const struct sockaddr FAR* name,int namelen);</p><p>
16、 s是標(biāo)識(shí)一個(gè)未連接套接口的描述字。</p><p> Name是欲進(jìn)行連接的端口名。</p><p> Namelen是名字長(zhǎng)度。</p><p><b> 3.3服務(wù)端函數(shù)</b></p><p> 3.3.1 send函數(shù)和recv函數(shù)</p><p><b> 1.se
17、nd函數(shù)</b></p><p> int send( SOCKET s,const char FAR *buf,int len,int flags ); </p><p> 不論是客戶還是服務(wù)器應(yīng)用程序都用send函數(shù)來(lái)向TCP連接的另一端發(fā)送數(shù)據(jù)。</p><p> 客戶程序一般用send函數(shù)向服務(wù)器發(fā)送請(qǐng)求,而服務(wù)器則通常用send函數(shù)來(lái)向
18、客戶程序發(fā)送應(yīng)答。</p><p> 第一個(gè)參數(shù)指定發(fā)送端套接字描述符。</p><p> 第二個(gè)參數(shù)指明一個(gè)存放應(yīng)用程序要發(fā)送數(shù)據(jù)的緩沖區(qū)。</p><p> 第三個(gè)參數(shù)指明實(shí)際要發(fā)送的數(shù)據(jù)的字節(jié)數(shù)。</p><p> 第四個(gè)參數(shù)一般置0。</p><p><b> 2.recv函數(shù)</b&
19、gt;</p><p> int recv( SOCKET s,char FAR *buf,int len, int flags); </p><p> 不論是客戶還是服務(wù)器應(yīng)用程序都用recv函數(shù)從TCP連接的另一端接收數(shù)據(jù)。</p><p> 第一個(gè)參數(shù)指定接收端套接字描述符。</p><p> 第二個(gè)參數(shù)指明 一個(gè)緩沖區(qū),該
20、緩沖區(qū)用來(lái)存放recv函數(shù)接收到的數(shù)據(jù)。</p><p> 第三個(gè)參數(shù)指明buf的長(zhǎng)度。</p><p> 第四個(gè)參數(shù)一般置0。</p><p> 3.3.2 close()函數(shù)</p><p> close函數(shù)用于關(guān)閉套接字,并立即返回到進(jìn)程。關(guān)閉后的套接字描述符不能再接收和發(fā)送數(shù)據(jù),再不能作為函數(shù)send()或recv()的參數(shù)。
21、如果套接字描述符訪問(wèn)計(jì)數(shù)在調(diào)用close后大于0(在多個(gè)進(jìn)程共享同一個(gè)套接字的情況下),則不會(huì)引發(fā)TCP終止序列(即不會(huì)發(fā)送FIN分節(jié))。</p><p> 3.3.3 select函數(shù)</p><p> select()的機(jī)制中提供一fd_set的數(shù)據(jù)結(jié)構(gòu),實(shí)際上是一long類型的數(shù)組, 每一個(gè)數(shù)組元素都能與一打開(kāi)的文件句柄(不管是Socket句柄,還是其他 文件或命名管道或設(shè)備句柄
22、)建立聯(lián)系,建立聯(lián)系的工作由程序員完成, 當(dāng)調(diào)用select()時(shí),由內(nèi)核根據(jù)IO狀態(tài)修改fd_set的內(nèi)容,由此來(lái)通知執(zhí) 行了select()的進(jìn)程哪一Socket或文件可讀。</p><p> 3.4 創(chuàng)建守護(hù)進(jìn)程</p><p><b> 創(chuàng)建步驟:</b></p><p><b> ?、偈惯M(jìn)程在后臺(tái)運(yùn)行</b>
23、</p><p> ②脫離控制終端,登錄會(huì)話和進(jìn)程組(創(chuàng)建新會(huì)話)</p><p> ③禁止進(jìn)程重新打開(kāi)控制終端</p><p> ?、荜P(guān)閉所有文件描述符</p><p><b> ?、莞淖儺?dāng)前工作目錄</b></p><p><b> ⑥重設(shè)權(quán)限掩碼</b></
24、p><p> ?、咛幚鞸IGCHLD信號(hào)</p><p><b> 心得體會(huì)</b></p><p> 經(jīng)過(guò)兩周的課程設(shè)計(jì),我們對(duì)Linux有了更深的體會(huì),意識(shí)到只有動(dòng)手去操作才能真的掌握它。同樣也對(duì)服務(wù)器有了多重的認(rèn)識(shí),認(rèn)識(shí)到其在生活中的重要性,和我們的生活密不可分。</p><p> 時(shí)間服務(wù)器更是重中所重,時(shí)間的
25、重要性越來(lái)越大,時(shí)間服務(wù)器作為時(shí)間的核心其重要性已經(jīng)不言而喻,且開(kāi)發(fā)成本較小,用時(shí)較少,易于開(kāi)發(fā)。不僅為我們以后的程序生涯打好基礎(chǔ),也能增加我們對(duì)編寫(xiě)程序的興趣。</p><p> 這次之后,我們小組還算是比較默契的。沒(méi)想到這項(xiàng)看起來(lái)不需要多少技術(shù)的工作卻是非常需要耐心和精力,在兩周后的今天我已明白課程設(shè)計(jì)對(duì)我來(lái)說(shuō)的意義,它不僅僅是讓我們把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力,
26、更重要的是同學(xué)間的團(tuán)結(jié),雖然我們這次花去的時(shí)間比別人多,但我相信我們得到的也會(huì)更多。</p><p> 在這次課程設(shè)計(jì)中,我們運(yùn)用到了以前所學(xué)的專業(yè)課知識(shí),比如并發(fā)服務(wù)器原理,I/O復(fù)用技術(shù),守護(hù)進(jìn)程的創(chuàng)建。正如孔子所說(shuō):“溫故而知新”,我們?cè)陂_(kāi)發(fā)的過(guò)程中有時(shí)會(huì)遇到問(wèn)題,等到解決之后,發(fā)現(xiàn)自己知道了更多的東西,對(duì)知識(shí)點(diǎn)有了更深刻的理解。</p><p> 這也激發(fā)了我今后努力學(xué)習(xí)的興趣
27、,我想這將對(duì)我以后的學(xué)習(xí)產(chǎn)生積極的影響。其次,這次課程設(shè)計(jì)讓我充分認(rèn)識(shí)到團(tuán)隊(duì)合作的重要性,只有分工協(xié)作才能保證整個(gè)項(xiàng)目的有條不絮。另外在課程設(shè)計(jì)的過(guò)程中,當(dāng)我們碰到不明白的問(wèn)題時(shí),指導(dǎo)老師總是耐心的講解,給我們的設(shè)計(jì)以極大的幫助,使我們獲益匪淺。因此非常感謝老師的教導(dǎo)。</p><p><b> 附錄一 系統(tǒng)界面 </b></p><p><b> 附錄
28、二 程序代碼</b></p><p><b> 客戶端程序:</b></p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include <string.h></p>&
29、lt;p> #include <unistd.h></p><p> #include <sys/socket.h></p><p> #include <netinet/in.h></p><p> #include <netdb.h></p><p> #define POR
30、T 1234</p><p> #define MAXDATASIZE 100</p><p> #define MAXLINE 100</p><p> int main(int argc,char * argv[])</p><p><b> {</b></p><p> int
31、 fd,numbytes;</p><p> char buf[MAXDATASIZE],sendline[MAXLINE];</p><p> struct hostent * he;</p><p> struct sockaddr_in server;</p><p> if (argc != 3) {</p>
32、<p> fprintf(stderr,"usage: %s <IP>address and myport\n", argv[0]);</p><p><b> exit(1);</b></p><p><b> }</b></p><p> if((he=gethostb
33、yname(argv[1]))==NULL){</p><p> perror("gethostbyname error.");</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> if((fd=socket(AF
34、_INET,SOCK_STREAM,0))==-1){</p><p> perror("Create socket failed"); </p><p><b> exit(1);</b></p><p><b> }</b></p><p> else print
35、f("Connect Success!\n");</p><p> bzero(&server,sizeof(server));</p><p> server.sin_family=AF_INET;</p><p> server.sin_port=htons(PORT);</p><p> server
36、.sin_addr=*((struct in_addr *)he->h_addr);</p><p> if(connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1) {</p><p> perror("Bind error.");</p><p>
37、<b> exit(1);</b></p><p><b> }</b></p><p> if((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1) {</p><p> perror("recv error.");</p><p>&
38、lt;b> exit(1);</b></p><p><b> }</b></p><p> buf[numbytes]='\0';</p><p> printf("Server Message: %s\n",buf); </p><p> close
39、(fd);</p><p><b> }服務(wù)器端程序:</b></p><p> #include <unistd.h></p><p> #include <stdio.h></p><p> #include <syslog.h></p><p>
40、 #include <signal.h></p><p> #include <sys/types.h></p><p> #include <sys/socket.h></p><p> #include <sys/select.h></p><p> include <arp
41、a/inet.h></p><p> #define PORT 1234</p><p> #define BACKLOG 5</p><p> #define MAXLINE 255</p><p> #define MAXFD 64</p><p> void demon_init(const ch
42、ar *pname,int facility)</p><p><b> {</b></p><p><b> int i;</b></p><p> pid_t pid;</p><p> if((pid=fork())!=0)</p><p><b>
43、 exit(0);</b></p><p><b> setsid();</b></p><p> signal(SIGHUP,SIG_IGN);</p><p> if((pid=fork())!=0)</p><p><b> exit(0);</b></p>
44、<p> chdir("/");</p><p><b> umask(0);</b></p><p> for(i=0;i<MAXFD;i++)</p><p><b> close(i);</b></p><p> openlog(pname,LOG
45、_PID,facility);</p><p><b> }</b></p><p> int main(int argc,char **argv)</p><p><b> {</b></p><p> int listenfd,connfd;</p><p>
46、socklen_t addrlen,len;</p><p> struct sockaddr_in client_addr;</p><p> struct sockaddr_in server;</p><p> char buff[MAXLINE];</p><p> time_t ticks;</p><p
47、> bzero(&server,sizeof(server));</p><p> bzero(&client_addr,sizeof(client_addr));</p><p> server.sin_family=AF_INET;</p><p> server.sin_port=htons(1234);</p>&
48、lt;p> server.sin_addr.s_addr=htonl(INADDR_ANY);</p><p> demon_init(argv[0],0);</p><p> if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1)</p><p><b> {</b></p>
49、<p> syslog(LOG_NOTICE|LOG_LOCAL0,"socket error");</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> if(bind(listenfd,(struct sockaddr *
50、)&server,sizeof(struct sockaddr))==-1)</p><p><b> {</b></p><p> syslog(LOG_NOTICE|LOG_LOCAL0,"socket error");</p><p><b> exit(-1);</b></p
51、><p><b> }</b></p><p> if(listen(listenfd,BACKLOG)==-1)</p><p><b> {</b></p><p><b> exit(-1);</b></p><p><b> }&
52、lt;/b></p><p><b> for(;;){</b></p><p> len=sizeof(client_addr);</p><p> connfd=accept(listenfd,&client_addr,&len);</p><p> ticks=time(NULL);&
53、lt;/p><p> snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));</p><p><b> int a;</b></p><p> if((a=write(connfd,buff,strlen(buff)))==-1)</p><
54、p><b> {</b></p><p> syslog(LOG_NOTICE|LOG_LOCAL0,"write error");</p><p><b> exit(0);</b></p><p><b> }</b></p><p>
55、 int fd_A[BACKLOG]; </p><p> int conn_amount; </p><p><b> int ret;</b></p><p> int i,new_fd;</p><p> fd_set fdsr;</p><p> int maxsock;
56、</p><p> struct timeval tv; </p><p> conn_amount = 0; </p><p> maxsock = listenfd;</p><p> while (1) {</p><p> FD_ZERO(&fdsr);</p><p&
57、gt; FD_SET(listenfd, &fdsr);</p><p> tv.tv_sec = 30;</p><p> tv.tv_usec = 0;</p><p> for (i = 0; i < BACKLOG; i++) {</p><p> if (fd_A[i] != 0) {</p>
58、<p> FD_SET(fd_A[i], &fdsr);</p><p><b> }</b></p><p><b> }</b></p><p> ret = select(maxsock + 1, &fdsr, NULL, NULL, &tv);</p><
59、;p> if (ret < 0) {</p><p> perror("select");</p><p><b> break;</b></p><p> } else if (ret == 0) {</p><p> printf("timeout\n")
60、;</p><p><b> continue;</b></p><p><b> }</b></p><p> for (i = 0; i < conn_amount; i++) {</p><p> if (FD_ISSET(fd_A[i], &fdsr)) {</p
61、><p> ret = recv(fd_A[i], buff, sizeof(buff), 0);</p><p> if (ret <= 0) { </p><p> printf("client[%d] close\n", i);</p><p> close(fd_A[i]);</p>&l
62、t;p> FD_CLR(fd_A[i], &fdsr);</p><p> fd_A[i] = 0;</p><p> } else { </p><p> if (ret < MAXLINE)</p><p> memset(&buff[ret], '\0', 1);</p&g
63、t;<p> printf("client[%d] send:%s\n", i, buff);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if
64、(FD_ISSET(listenfd, &fdsr)) {</p><p> new_fd = accept(listenfd, (struct sockaddr *)&client_addr, &len);</p><p> if (new_fd <= 0) {</p><p> perror("accept"
65、;);</p><p><b> continue;</b></p><p><b> }</b></p><p> if (conn_amount < BACKLOG) {</p><p> fd_A[conn_amount++] = new_fd;</p><p
66、> printf("new connection client[%d] %s:%d\n", conn_amount,</p><p> inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));</p><p> if (new_fd > maxsock)</p><
67、p> maxsock = new_fd;</p><p><b> }</b></p><p><b> else {</b></p><p> printf("max connections arrive, exit\n");</p><p> send(new
68、_fd, "bye", 4, 0);</p><p> close(new_fd);</p><p><b> break;</b></p><p><b> }</b></p><p><b> } </b></p><p>
69、;<b> }</b></p><p> for (i = 0; i < BACKLOG; i++) {</p><p> if (fd_A[i] != 0) {</p><p> close(fd_A[i]);</p><p><b> }</b></p><p
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- linux程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告-- linux c 程序設(shè)計(jì)
- linux課程設(shè)計(jì)報(bào)告-- 構(gòu)建綜合網(wǎng)絡(luò)服務(wù)器
- 課程設(shè)計(jì)--linux c 程序設(shè)計(jì)
- linux課程設(shè)計(jì)-linux下ftp服務(wù)器的搭建
- 課程設(shè)計(jì)報(bào)告---udp服務(wù)器設(shè)計(jì)
- 課程設(shè)計(jì)--linux中samba服務(wù)器配置方法
- linux課程設(shè)計(jì)---linux環(huán)境下c語(yǔ)言程序設(shè)計(jì)
- 網(wǎng)絡(luò)課程設(shè)計(jì)---linux服務(wù)器的配置---ubuntu操作系統(tǒng)
- 程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 系統(tǒng)軟件程序設(shè)計(jì)報(bào)告(linux下c語(yǔ)言程序課程設(shè)計(jì)報(bào)告)
- linux操作系統(tǒng)課程設(shè)計(jì)-- 構(gòu)建綜合網(wǎng)絡(luò)服務(wù)器
- 嵌入式課程設(shè)計(jì)--linux tcp服務(wù)器_客戶端通信程序
- 《java程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告
- web程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 【課程設(shè)計(jì)】linux環(huán)境下samba服務(wù)器配置與實(shí)現(xiàn)
- udp服務(wù)器設(shè)計(jì)---課程設(shè)計(jì)
- tcp_ip課程設(shè)計(jì)---基于套接字的客戶機(jī)服務(wù)器程序設(shè)計(jì)
- 課程設(shè)計(jì)---linux環(huán)境下的c語(yǔ)言程序設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論