socket programming
socket 本質上是一種 IPC(Inter-Process Communication)技術,用於兩個或多個 process 之間進行資料交換。
在網路領域,socket 著重的是不同主機上的 process 之間如何互相傳遞資料,而不只是同一台機器上的 IPC。
這篇筆記會簡單介紹 Linux 提供的 socket API,並用兩個範例說明如何分別透過 TCP 和 UDP 協定傳輸資料。

本文章所使用的環境
- 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 相關的程式時,需要先引入:
#include <arpa/inet.h> // sockaddr 相關
#include <sys/socket.h>
socket
int socket(int domain, int type, int protocol)
domain
定義要建立哪種類型的 socket,常用的有:
- AF_UNIX, AF_LOCAL:用於同一台主機上 process 之間的溝通
- 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 支援的所有協定,詳細說明請參考 protocol man page。
Return Value
建立成功後會回傳該 socket 的檔案描述符(socket file descriptor),後續所有操作都透過這個值進行。若建立失敗則回傳 -1(INVALID_SOCKET)。
檔案描述符是什麼?
參考資料:
建立 socket example
#include <stdio.h>
#include <sys/socket.h>
int main() {
// AF_INET = IPv4
// SOCK_DGRAM = UDP
int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
// 檢查是否建立成功
if (socket_fd < 0) {
printf("Fail to create a socket.");
}
// 根據 socker_fd 關閉剛剛創立的 socket
close(socket_fd);
return 0;
}
完整專案請參考 GitHub。