- Socket Connection
- Library
- Init WSA
- Create a Socket
- Setup Address & Port
- Bind Socket
- Listener
- Wait for Accepting
- Close Socket
- gcc -o server server.c
- gcc -o client client.c
- gcc -o server server.c -lwsock32
- gcc -o client client.c -lwsock32
節錄自筆者的Network Programming其中的資料,一般在Windows底下如果要寫網路程式多半會想到Microsoft MFC提供的相關API,而Linux底下則多使用Unix Socket來實現,這裡筆者要簡短的介紹如何使用最基礎的socket函式來實做socket connection。
在正式進入程式碼之前還是要先簡單了解一下基本的OSI Model。
只是想要藉由這張圖來讓讀者知道我們現在做的部份是在OSI七層中的最上層-應用層。有了上面的簡單概念後我們可以開始來看程式碼了。
Download:Server.c
Download:Client.c
這是一個主從式的架構(Server-Client),為了讓程式碼可以在Linux以及Windows上運行,特別針對這兩個平台來撰寫。我們先來看一下流程圖。
其中Initial WSA這個部份是Windows才需要的,其餘兩個平台都可適用。
########Server Side (Server.c) ###########
以Windows Socket來說,我們使用了winsock1.1來實做,而unix部份則是一般的unix socket。
如同前面所提,Windows Socket需要初始化WSA才能使用。
建立一個Socket,其中比較重要的是SOCK_STREAM,定義這個socket是以stream的型態來傳輸,另外還有raw,datagram等型態,您可以自行查閱網路。
設定IP跟Port的部份其實很直觀,只是在型態的部份可能會讓讀者很困惑。
將socket server跟sockaddr in給bind起來,如此才能傳送接收訊息。也許你會問為什麼還要這麼麻煩做那麼多事情,別忘了這裡是socket最低階的寫法,自然什麼事情都要自己來啦!
監聽Client端的連線,其中10是最大Quene值,代表著同時間可以有10個人在等待連線。
等待Client端做確認才完成一個socket連線
如同開檔關檔一樣,使用完連線請關閉它。
########### Client Side (Client.c) #############
如果你看得懂Server的部份,那Client就更沒問題了,Client的部份很簡單,只是建立一個Socket然後去對Server做連線
只是不要忘了Client端的IP設定要設成Server的IP(不然你要連去哪裡?),既然是要去連Server那當然是用Connect()函式,重點只有這個部份,連線完後也記得關閉檔案。
透過上面的簡單Server-Client的連線範例你就可以寫出許多網路連線程式了。
編譯方式:
GCC:
MinGW:
這裡特別說明MinGW的部份,雖然MinGW是適用於Windows底下的GCC,但是library的部份還是得要使用由MinGW所提供的才能編譯,wsock32是winsocket 1.1,而ws2_32是winsocket2.0的library。
程式一開始的定義載入了wsock32.lib那是給Visual C++使用的,所以同樣的你也可以直接複製上面的程式碼到Visual C++去編譯成Console程式。
參考資料:
關於Unix Socket設計的部份我很推薦下面的資料
除此之外,有時間的話也可以參考Linux System Programming的 I/O部份,有助於了解socket通訊的底層概念。
另外還有微軟的MSDN裡的WinSocket資訊:
http://msdn.microsoft.com/en-us/library/ms740673(VS.85).aspx
以及IBM的i5/OS Communication的部份:
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rzab6/rzab6soxoverview.htm
如果你需要將c socket的部份封裝成C++的形式,下面是我將C Socket轉成C++的範例:
Download: C++ Socket
另外你還可以參考以下幾篇較進階的文章
[C/C++] Socket Programming: Upload/Download
[C/C++] Socket Programming: Get Ethernet Informati...
No comments:
Post a Comment