server.c:從用戶端讀字元,然後将每個字元轉換為大寫并回送給用戶端。

client.c:從指令行參數中獲得一個字元串發給伺服器,然後接收伺服器傳回的字元串并列印。
others...
1.該例子不僅功能簡單,而且簡單到幾乎沒有什麼錯誤處理,我們知道,系統調用不能保證每次都成功,必須進行出錯處理,這樣一方面可以保證程式邏輯正常,另一方面可以迅速得到故障資訊。
為使錯誤處理的代碼不影響主程式的可讀性,需要把與socket相關的一些系統函數加上錯誤處理代碼包裝成新的函數,做成一個子產品!
2.目前實作的client每次運作隻能從指令行讀取一個字元串發給伺服器,再從伺服器收回來,現在我們把它改成互動式的,不斷從終端接受使用者輸入并和server互動。
3.使用fork并發處理多個client的請求! 網絡伺服器通常用fork來同時服務多個用戶端,父程序專門負責監聽端口,每次accept一個新的用戶端連接配接就fork出一個子程序專門服務這個用戶端。但是子程序退出時會産生僵屍程序,父程序要注意處理sigchld信号和調用wait清理僵屍程序。
4.setsockopt
表示允許建立端口号相同但ip位址不同的多個socket描述符。在server代碼的socket()和bind()調用之間插入如下代碼:
int opt = 1;
setsockopt(listenfd, sol_socket, so_reuseaddr, &opt, sizeof(opt));
原因:client終止時自動關閉socket描述符,server的tcp連接配接收到client發的fin段後處于time_wait狀态。tcp協定規定,主動關閉連接配接的一方要處于time_wait狀态,等待兩個msl(maximum segment lifetime)的時間後才能回到closed狀态,因為我們先ctrl-c終止了server,是以server是主動關閉連接配接的一方,在time_wait期間仍然不能再次監聽同樣的server端口。msl在rfc1122中規定為兩分鐘,但是各作業系統的實作不同,在linux上一般經過半分鐘後就可以再次啟動server了。
5.使用select
select是網絡程式中很常用的一個系統調用,它可以同時監聽多個阻塞的檔案描述符(例如多個網絡連接配接),哪個有資料到達就處理哪個,這樣,不需要fork和多程序就可以實作并發服務的server。
<a target="_blank" href="http://www.akaedu.org/down/linuxc.pdf"></a>
<a target="_blank" href="http://www.akaedu.org/down/linuxc.pdf">原文位址</a>