[C/C++] Socket Connection

  • Socket Connection
  • 節錄自筆者的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) ###########

    • Library
    • 以Windows Socket來說,我們使用了winsock1.1來實做,而unix部份則是一般的unix socket。

    • Init WSA
    • 如同前面所提,Windows Socket需要初始化WSA才能使用。

    • Create a Socket
    • 建立一個Socket,其中比較重要的是SOCK_STREAM,定義這個socket是以stream的型態來傳輸,另外還有raw,datagram等型態,您可以自行查閱網路。

    • Setup Address & Port
    • 設定IP跟Port的部份其實很直觀,只是在型態的部份可能會讓讀者很困惑。

    • Bind Socket
    • 將socket server跟sockaddr in給bind起來,如此才能傳送接收訊息。也許你會問為什麼還要這麼麻煩做那麼多事情,別忘了這裡是socket最低階的寫法,自然什麼事情都要自己來啦!

    • Listener
    • 監聽Client端的連線,其中10是最大Quene值,代表著同時間可以有10個人在等待連線。

    • Wait for Accepting
    • 等待Client端做確認才完成一個socket連線

    • Close Socket
    • 如同開檔關檔一樣,使用完連線請關閉它。

    ########### Client Side (Client.c) #############

    如果你看得懂Server的部份,那Client就更沒問題了,Client的部份很簡單,只是建立一個Socket然後去對Server做連線

    只是不要忘了Client端的IP設定要設成Server的IP(不然你要連去哪裡?),既然是要去連Server那當然是用Connect()函式,重點只有這個部份,連線完後也記得關閉檔案。

    透過上面的簡單Server-Client的連線範例你就可以寫出許多網路連線程式了。

    編譯方式:

    GCC:

    • gcc -o server server.c
    • gcc -o client client.c

    MinGW:

    • gcc -o server server.c -lwsock32
    • gcc -o client client.c -lwsock32

    這裡特別說明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...

    [C/C++] Scoket Programming : Non-Blocking Communat...

    [C.C++] Socket Programming: MultiPerson Chat

No comments:

Post a Comment

Orange - data analysis tool

Installation pip install orange3 Run orange python -m Orange.canvas