Re: [閒聊] 程設作業

看板NTUE-CS102作者 (鳳狼)時間13年前 (2011/06/15 04:33), 編輯推噓5(504)
留言9則, 6人參與, 最新討論串27/30 (看更多)
※ 引述《game0416 (鳳狼)》之銘言: : 人參,我覺得下份作業比較令人恐懼..吧 每過一段時間,回頭看自己講的話就覺得很可怕,真的 沒道義的才寫這作業,當然應該全員裝死說不會寫的嘛對不對 ......所以我沒道義,明明講了不寫,結果還是寫到一個程度寫不下去這樣_A_ 就變成我現在對幾大雷科感到 非 常 有 壓 力 有沒有人可以整理考古題或洩題詳解借我用orzz 好,所以首先先提一下 文章代碼(AID): #1A8y1irR (NTUE-CS100) 這串,我覺得從 文章代碼(AID): #1A9i0Nah (NTUE-CS100) 開始看算剛好,看人情況需求 還剩兩天,有心可以試著跟我一樣拿個80%表示誠意(?) 不變的,可以很有種去幾個人的資料夾幹作業檔。 -- 因為我整體前50%的分數也算參考那整篇,所以先講解那整串有什麼 1.學長自寫的幾個函式,分別為 void writeInt(int sockfd, int number) 傳送整數 int readInt( int sockfd ) 接收整數 void writeString(int sockfd, char *buffer) 傳送字串 (替代原Writen) void readString(int sockfd, char *buffer ) 接收字串 (替代原Readline) void serv_dir(int sockfd) 伺服端DIR功能 void cli_dir( int sockfd ) 客戶端DIR功能 嗯...需要看這篇教學的我覺得可能沒有足夠時間理解這些是什麼 所以就隨便看看旁邊的中文註解就好,下面我覺得也沒什麼好寫詳細的了 原本那篇就蠻清楚的 全班看得懂的大概不超過八個人,這八個我已知三個到剛才都是一起死死(?) 附上原檔案內容.c檔案..借用國外學校資源(?) http://www.cs.odu.edu/~cs779/stevens2nd/tcpcliserv/tcpcli01.c http://www.cs.odu.edu/~cs779/stevens2nd/tcpcliserv/tcpserv01.c -- 2.code部分範例 這個我接下來全文胡亂說明這樣,因為分伺服客戶兩端,希望各位還能看懂 然後追加一點東西hmm 首先,在serv跟cli的main之前都複製貼上前面的函式,就照上一頁順序引入 伺服端可以不引入客戶端dir,反之亦同 從serv開始...main裏頭,先直接看到 str_echo(connfd); /* process the request */ 這段,這段是接收資料做處理的部分,就從這裡開始修改 我沒特別寫太漂亮函式另外呼叫,就直接從取代這行開始做 取出原函式內下面這段開始做修改 for ( ; ; ) { if ( (n = Readline(sockfd, line, MAXLINE)) == 0) //讀不到資料 return; /* connection closed by other end */ Writen(sockfd, line, n); } -- 呃,應該是只要無窮迴圈的部分 for ( ; ; ) { } 第一步是接收連上的cli傳來訊息,所以就readString (connfd,cmd)讀傳來資料 : 請記得宣告一個char cmd[1000];來當命令存放 再來針對傳來的資料做各個判斷 原文內是寫成 if (strcmp(cmd,"dir")==0) : cmp比較,全部相同回傳0...就辨認字串是不是dir 因為cli輸入用的stdin好像有追加到後面換行符號,所以直接用有點問題,請改成 if (strncmp(cmd,"dir",3)==0) : ncmp可以指定只比前n個字元,會比較沒有判斷問題 判斷是傳來dir命令,就能用學長寫好的serv_dir傳回資料夾內容 這邊要記得,serv_dir(int sockfd)有用到DIR類別,檔頭要引入 #include <dirent.h> 下頁接這部分的cli要改多少 -- cli這部分比較不同,是改str_cli(FILE *fp, int sockfd)的內容 一樣只要留下 while (Fgets(sendline, MAXLINE, fp) != NULL) { } 就夠了,與伺服端相反,這邊第一件事是送資料出去 原本程式上面,輸入進來的東西是存在 sendline 這個變數 因此,送出資料的writeString引數為(sockfd, sendline) 送出之後,讓cli自己針對送出的命令做不同行為 一樣用strncmp判斷送出的命令是什麼,然後呼叫cli端dir函式 if (strncmp(sendline,"dir",4)==0) cli_dir(sockfd); 至此,編譯正常,能連上50%分數差不多get 啊不要跟我一樣忘記編譯指令就好 cc -L/tmp -o tcpserv01 tcpserv01.c -lunp -- 再來,exit 10%不拿白不拿 在前文if後面,追加 else if (strncmp(命令變數,"exit",4)==0) 嗯...看清楚code就知道,離開迴圈/函式後 外面的exit(0); 會幫你斷線 所以兩邊都一樣一個break 跳出迴圈就完成了 好,所以再來有兩個選擇,一是get一個是特殊功能 我搞不懂get怎麼寫,所以轉頭先幹掉特殊功能 這裡個人推薦rm,後面只會有一個引數檔名,相對好做非常多 而且只要在serv做字串處理,cli這邊射後不理就好了 -- 所以說,cli這邊大概長成 else if (strncmp(命令變數,"rm ",3)==0) ; 就沒有了,主要看serv端要怎麼做字串處理 開頭一樣要抓命令,if判斷式內容cli一樣 因為我們以前用過一個函式叫做system("pause"); 其實是對系統命令列下pause : 開始 執行 cmd pause就會看到熟悉的東西(y) 這裡我們要利用這個函式做rm...先想命令是長怎樣 比方要刪除一個a.txt,下的指令就是rm a.txt 也就是說,我期待會有system("rm a.txt")這樣的東西出現 然後在serv端執行就有了 system()的引數是個字串,所以有個char * 塞進去就能用 要如何生出這樣的字串,就是用strcpy strcat strstr -- 首先,宣告一個臨時用的變數char tmp[1000]; 用來存放我們要做出來的這個命令句 第一步,因為確定這個命令開頭一定是"rm" 所以用strcpy(tmp,"rm")把tmp設定好 下一步,要把檔名接上來 字串連接是strcat(字串A,字串B) 可是在這之前,要先找到檔名是什麼 所以用strstr()找,在cmd裏頭哪邊開始是空白 : rm a.txt : ↑ 這個空白 strstr會回傳一個char*,指向空白的位置 空白位置+1,就會是檔名起點,把空白留下,跟前面設好的rm擺在一起 恰巧就會變成"rm a.txt" 因此,這段其實就只有strcat(tmp,strstr(cmd," ")); 最後system("tmp");就做完rm功能 對,就這樣四行。 -- 所以就是這樣的80% 啊...不對,我們還有個作業規範要談 假設 server 執行檔名稱為 tcpserv01, 則 server 端執行的方式為 tcpserv01 [server port] 假設 client 執行檔名稱為 tcpcli01, 則 client 端執行的方式為 tcpcli01 [server IP address] [server port] 這邊是以前提過,可是大概都忘記的東西 看一下int main() 改寫成int main(int argc, char **argv) argc會存總共有多少個引數,argv這個字串陣列會逐個將引數分別存入 只是argv[0]會是執行檔案本身 : 詳細goooooogle就有了,這邊不想提太多 -- 針對serv這部分 引數只有一個port 所以把原本指定port的地方 servaddr.sin_port = htons (5566); 把引數放進去變這樣 servaddr.sin_port = htons (argv[1]); ...是錯的,編譯不會過 因為這邊吃的是int,argv[1]是個字元陣列 拿起我們一上期末考題出過的atoi() 寫成 servaddr.sin_port = htons (atoi(argv[1])); 這樣就ok cli端port設定同,唯引數放在第二個,所以是atgv[2] IP那邊沒有因為編寫方便改的話就不用改,原本就寫好了這樣 -- 所以就這樣完成,get不會寫放掉30%,實質20%這樣 我還是不懂為什麼要因為隨口說的話而搞到現在 寫這東西包含這個亂糟糟的教學從無到有摸了六小時Orz 然後看完教學的用不到一小時就該做出來,跟我拿差不多的分數 這世界到底怎麼了(趴 我覺得我對不起同個時間點跟我一起開始搞的,比我還要早幾天開工寫不出來的的兩三人 因為你們拚死浪費了兩天做不出結果,會因為我這篇讓其他人可以爽爽拿分 非常抱歉。 -- 所恐懼的,不是沒有知識的大眾  所憎恨的,不是深沉幽暗的人心 而是自以為是的思考之聲 而是自恃甚高的執法者 所毀滅的,不是溫馨和諧的世界 這是我最後的期許,沒有憤怒、沒有悔恨 而是自欺欺人的夢境 只剩下,渾沌的死亡呼吸                節自 新月神話-弒王者 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.184.23.107

06/15 04:38, , 1F
因為是寫完趕著寫,有問題可以今天明天我在學校時問問
06/15 04:38, 1F

06/15 04:38, , 2F
大概有老馬少寫或挖了洞我也不知道了
06/15 04:38, 2F

06/15 04:44, , 3F
大大可以講中文嗎 我崩潰了
06/15 04:44, 3F

06/15 06:14, , 4F
感謝大大無私分享 好帖 我頂
06/15 06:14, 4F

06/15 06:14, , 5F
未看先猜樓上&樓樓上看不懂
06/15 06:14, 5F

06/15 07:17, , 6F
加油吧....當初也很痛苦+1
06/15 07:17, 6F

06/15 07:18, , 7F
但是寫完對socket programing有些了解
06/15 07:18, 7F

06/15 09:31, , 8F
06/15 09:31, 8F

06/15 16:48, , 9F
晚點不會在,先謝chchwy學長指導
06/15 16:48, 9F
※ 編輯: game0416 來自: 120.127.47.30 (06/16 13:55)
文章代碼(AID): #1DzyMJlJ (NTUE-CS102)
討論串 (同標題文章)
文章代碼(AID): #1DzyMJlJ (NTUE-CS102)