Re: [閒聊] 程設作業
※ 引述《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
06/15 07:17, 6F
→
06/15 07:18, , 7F
06/15 07:18, 7F
推
06/15 09:31, , 8F
06/15 09:31, 8F
→
06/15 16:48, , 9F
06/15 16:48, 9F
※ 編輯: game0416 來自: 120.127.47.30 (06/16 13:55)
討論串 (同標題文章)
本文引述了以下文章的的內容:
閒聊
4
6
完整討論串 (本文為第 27 之 30 篇):
閒聊
5
7
閒聊
1
1
閒聊
2
3
閒聊
8
16
閒聊
1
6
閒聊
4
7
閒聊
3
6
閒聊
5
6
閒聊
3
17
閒聊
15
20