網路程式設計 作業一

Last updated:

  1. 將你的Unix系統架設起來,下載教科書 第三版中的程式原始檔,解壓縮後 依 README 檔案中的說明進行安裝。
  2. 安裝完成後修改 intro/daytimetcpcli.c檔,使得連上server時先送出學號。
  3. 修改完成後與老師伺服器 (IP位址為140.127.220.246) 連線上傳。

安裝部份

安裝時可能會遭遇到一點挫折,大部份原因是某些目錄中的make程序會產生錯誤訊息,只要依Readme說明略過有問題的目錄及檔案即可, 或參考以下李嘉偉同學所寫的關於第三版的程式原始檔安裝程序

tar zxvf unpv13e.tar.gz
cd unpv13e
./configure
cd lib
make
cd ../libfree
make
cd ../intro
make daytimetcpcli
./daytimetcpcli 127.0.0.1
另外, daytimtcpcli 必須要在本機有執行 Daytime Server 的時候才會有正確的顯示結果。 Ubuntu 預設不執行 Daytime Server ,所以執行 daytimetcpcli 之前必須先 make Daytime server 並執行,如下所示。
make daytimetcpsrv
./daytimetcpsrv &
上述第二列是將 daytimetcpserv 以背景的方式執行。 前面的 ./ 是因為daytimetcpsrv並未放在系統執行指令的路徑 中(intro 並非系統執行指令會尋找的路徑),所以要告知系統 daytimetcpsrv 就放在現目錄 (即./)中。至於 & 是說此程式要在背景執行。 如果你不是以管理者身份登入系統的話,則上述最後一步驟無法執行。 這是因為啟動 Daytime Server 需要管理者權限。你可以將最後執行的部份改為

sudo ./daytimetcpsrv &
此時系統可能會詢問你管理者的密碼。 如果已用系統管理者的權限執行仍不能順利執行,試著將最後面的"&"去掉, 改成在前景執行Server端程式。此時你需要另開一個終端機(Terminal)程式來執行 Client 程式。

至於執行 Daytime Client 的步驟如下:


make daytimetcpcli
./daytimetcpcli 127.0.0.1
正確無誤後即可將 Daytime Server 關掉。步驟如下:

/* 結束 Daytime Server */
sudo -s
killall daytimetcpsrv
exit 

其中 sudo -s 表示要用管理者的身份執行後面的程式。此時系統可能會詢問你管理者的密碼。 killall 是在測試完後將 Daytime Server 程序砍掉。

程式修改部分

  1. 建議先將intro/daytimetcpcli.c檔copy成另一個複本(如np_hw1_cli.c),然後修改複本檔。
  2. Client要送出學號資料給Server,需使用write(或作者提供的包裝版Write)函數。用法請參考 intro/daytimetcpserv.c檔。基本上第二個參數(字元指標)指向你要送出的資料,第三個參數說明要送出多少字元。
  3. 程式須在與Server建立連線後先送出學號資料,然後再讀取Server送回的日期時間資訊。
  4. 改完後要編譯你的程式。建議可用文字編輯器修改此程式目錄(intro/)中的 Makefile檔,在其中加入下列文字(此處假設你的程式 名稱是np_hw1_cli.c)
    np_hw1_cli:	np_hw1_cli.o
    		${CC} ${CFLAGS} -o $@ np_hw1_cli.o ${LIBS}
    	
    
  5. 加入上述文字後將Makefile存檔,之後即可以用 make 指令編譯且連結出你的執行檔。如下面的執行範例
    lhyen@lhyen-desktop:~/np/unpv13e/intro$ make np_hw1_cli
    gcc -I../lib -g -O2 -D_REENTRANT -Wall   -c -o np_hw1_cli.o np_hw1_cli.c
    gcc -I../lib -g -O2 -D_REENTRANT -Wall -o np_hw1_cli np_hw1_cli.o ../libunp.a -lpthread
    	
    
  6. 上述紅色文字是在 Ubuntu 上執行時會出現的訊息,不同系統出現的訊息可能不同。編譯成功後此目錄中就有執行檔,檔名就是你C程式檔名去掉.c。在我們的例子中就是 np_hw1_cli。

連線上傳部分

  1. 請先下載Server端程式,配合你寫的Client程式先在Local端測試。 測試正確無誤後再連線上傳老師的 Server。未經Local端測試即上傳老師的 Server 導致Server程式Block或記錄檔產生多筆無效紀錄者將酌予扣分。
  2. 下載的Server端程式放在Client程式同一目錄,也須先編譯後才能執行。建議用修改Makefile的方式達成。修改內容如下
    np13s_hw1_serv:	np13s_hw1_serv.o
    		${CC} ${CFLAGS} -o $@ np13s_hw1_serv.o ${LIBS}
    	
    
  3. 此Server端程式亦需系統管理者的權限方能執行。如權限不足將出現類似下列訊息
    lhyen@lhyen-desktop:~/np/unpv13e/intro$ ./np13s_hw1_serv &
    [1] 6097
    lhyen@lhyen-desktop:~/np/unpv13e/intro$ bind error: Permission denied
    
    [1]+  Exit 1                  ./np13s_hw1_serv	
    
    如果已用系統管理者的權限執行仍不能順利執行,試著將最後面的"&"去掉, 改成在前景執行Server端程式。此時你需要另開一個終端機(Terminal)程式來執行 Client 程式。
  4. 如果執行時出現 "Address already in use" 的錯誤訊息,請確認先前的 Daytime Server 是否已關掉。此 Server 程式與 Daytime Server 佔用相同的 port number,但每個 port 同一時間都只能讓一個 server 佔用。
  5. 將Server端程式執行後,可以用 Client 程式連至 127.0.0.1。如正確會出現日期時間資訊,如下列執行結果
    lhyen@lhyen-desktop:~/np/unpv13e/intro$ ./np_hw1_cli 127.0.0.1
    Wed Mar  4 18:17:02 2015
    	
    
  6. Server端程式執行結果將會被記錄到Server端程式所在目錄中的np13s_hw1_serv.log紀錄檔中。可用cat指令 或文字編輯器檢視此檔案內容,判別 Server 是否有收到 Client 送出的學號資訊。在下列例子中Server程式 正確收到Client程式送來的學號 "M9802007"。
    lhyen@lhyen-desktop:~/np/unpv13e/intro$ cat np13s_hw1_serv.log
    ===================
    Wed Mar  4 18:17:02 2015: connected from 127.0.0.1, port 57750
    id = M9802007
    Wed Mar  4 18:17:02 2015: disconnected from 127.0.0.1, port 57750
    
  7. 如果上述Local端測試成功無誤,即可與老師的Server程式連線。IP位址是140.127.220.246。

Maintained by Li-Hsing Yen.

Please report any mistakes/typos.