socket programming
socket 本質上是一種 IPC (Inter-Process Communication) 的技術,用於兩個或多個 process 進行資料交換或者通訊。
在網路領域,socket 著重的不是同一台主機間 process 的通訊,而是不同主機執行的 process 互相交換資料的通訊。
我們在寫 socket programming 的時候會使用 os 提供的 API,來避免重複造輪子,今天的筆記會簡單介紹一下 linux 提供的 socket API,並用兩個簡單的範例介紹如何用 tcp 跟 udp 協定透過 socket 傳輸資料。

本文章所使用的環境
- kernel:
5.11.0-37-generic - gcc version:
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 - GNU Make:
4.2.1
在寫 socket 相關的程式的時候,需要先
|
|
socket
|
|
domain
定義要建立哪一種類型的 socket,常用的有以下幾種類型
- AF_UNIX, AF_LOCAL: 用於本機間
process的溝通 - AF_INET, AF_INET6
- AF_INET: IPv4 協定
- AF_INET6: IPv6 協定
詳細的選項可以參考 socket 的 man page
type
socket 傳輸資料的手段(communication semantics)
- SOCK_STREAM: 對應到
tcp協定 - SOCK_DGRAM: 對應到
udp協定
protocol
設定通訊協定的號碼,通常在寫的時候會填入 0,kernel 會根據上面的兩個參數自動選擇合適的協定。
/etc/protocols 可以看到 linux 底下支援的協定
Return Value
成功建立 socket 之後,此函式會返回該 socket 的檔案描述符(socket file descriptor),在之後的操作可以透過這個回傳值來操作我們建立的 socket。 如果建立失敗則會回傳 -1(INVALID_SOCKET)
檔案描述符是什麼?
參考資料
建立 socket example
|
|
在 github 參考完整專案