Linux 網路程式設計透過 Socket 介面進行。Socket 是一種特殊的檔案描述符,提供進程間通信 (IPC) 機制。
Socket API 流程:socket() → bind() → listen() → accept() → read()/write() → close() (TCP 伺服器)
| 類型 | 宏定義 | 協議 | 特性 |
|---|---|---|---|
| 流式 Socket | SOCK_STREAM | TCP | 可靠、面向連線、雙向位元組流、有流控/擁塞控制 |
| 資料報 Socket | SOCK_DGRAM | UDP | 無連線、不可靠、訊息邊界保留、低延遲、表頭小 |
| 原始 Socket | SOCK_RAW | IP/ICMP/自定義 | 直接存取網路層/傳輸層表頭,用於協議開發、封包分析 |
應用層:HTTP, FTP, SMTP, DNS, SSH
↓
傳輸層:TCP (可靠串流) ◄─── Socket API ───► 應用程式
↓ ↑
UDP (資料報) │
↓ │
網路層:IP (路由、分片) │
↓ │
資料鏈路層:Ethernet, WiFi, PPP
↓
物理層:光纖, 雙絞線, 無線電波
// 建立
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // IPv4 TCP
int sockfd = socket(AF_INET6, SOCK_DGRAM, 0); // IPv6 UDP
// 綁定
struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(8080), .sin_addr.s_addr = INADDR_ANY };
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
// 監聽 (僅 TCP)
listen(sockfd, SOMAXCONN);
// 接受連線 (僅 TCP)
int connfd = accept(sockfd, NULL, NULL);
// 發送/接收
send(sockfd, buf, len, 0);
recv(sockfd, buf, len, 0);
sendto(sockfd, buf, len, 0, (struct sockaddr*)&dst, sizeof(dst)); // UDP
recvfrom(sockfd, buf, len, 0, (struct sockaddr*)&src, &slen); // UDP
// 關閉
close(sockfd);
shutdown(sockfd, SHUT_RDWR); // 半關閉
select/poll/epoll (Linux)、kqueue (BSD/macOS)、IOCP (Windows)fcntl(sock, F_SETFL, O_NONBLOCK)、aio_read/aio_writesetsockopt (SO_REUSEADDR, TCP_NODELAY, SO_RCVBUF/SO_SNDBUF)AF_INET6 + IPV6_V6ONLY=0 同時接受 IPv4/IPv6