2007年11月13日 星期二

C語言的Socket Programming初探

用久了高階程式語言,再來看低階的程式語言,真的很痛苦,再次應證越低階的語言越是給機器看的..
最近用C語言寫了一個簡單的Server,看了一下C的socket,真的不是平常人看的....
所以,下面開始是限制級文章,不是常人的請離開....

因為是初探,所以function如何使用,fuction的參數有那些,參數型態是什麼等等,這些都不會提到,只會做整體的概念性介紹。

一開始先看圖,花了二個小時畫的,一定要仔細看看啊~


左半邊表示server端,右半邊表示client端,而粉紅色箭頭以上為準備階段;以下為傳送資料的階段。很明顯的server要準備的工作比client來的多,因為server要負責開啟port的關係。而傳送資料的階段兩邊做的事情是對稱的,一邊傳資料,一邊收資料。

先說明右半邊client端,socket()是告訴電腦要用那些種方式連線,而internet為TCP/IP的構架,所以是跟電腦說要用TCP或UDP等方式連線,之後的連線就用此種方式。而socket()會給你一個編號(socket file descriptor, sockfd),表示電腦已為你做好此方式連線的準備,再用connect()告訴電腦你要去那個IP位址,並附上編號,告訴電腦用這種方式連線並且要連到這個IP。至此,連線已經完全做好準備,並進入傳送資料的階段,收送資料,如圖藍色箭頭。

左半邊server端,socket()取得sockfd後,用bind()請求開port的資源,再用listen()執行真正開port的動作,最後準備好開始接收資料用accept()。為什麼之前說看低階語言很痛苦,光光是開port的動作,較高階的程式語言只要說port號即可!而低階語言需要的動作就有4步。而且較容易忽略的地方是,listen的動作還要細分成2步,一個是listen(),一個是accept()。話說開port不是就要收資料,不然開個port在那邊要幹嘛~開了個大門然後不準進出,你說是不是啊是不是啊 ~"~ 。至此,準備階段完成,進入傳送資料的階段。而accept()給你一個sockfd,告訴你是誰連線到server,之後要收送資料給client,都是利用這個sockfd。

以上為一對一的連線,一個server對一個client,現實的情況是有多個client,所以還需要用別的機制來處理連線。

沒有留言: