Socket 是網絡通信的基石,也是 Linux 後端開發的必經之路。本指南基於 CentOS 實測,涵蓋從基礎 API 到完整 Client/Server 架構的核心知識體系,旨在帶你走進 Linux 網絡開發的大門。
socket() → bind() → listen() → accept() → read/write() → close()
↑_____________while(1)_____________|
socket():創建通信端點,返回文件描述符。bind():綁定 IP:Port,INADDR_ANY 監聽所有網卡。listen():轉為被動模式,第二參數為已完成連接隊列長度。accept():阻塞等待客戶端,返回新 socket 專用於該連接。socket() → connect() → read/write() → close()
connect():三次握手發起者,連接指定 Server IP:Port。struct sockaddr_in {
sa_family_t sin_family; // AF_INET (IPv4)
in_port_t sin_port; // htons(port) 主機序轉網絡序
struct in_addr sin_addr; // IP 地址
// sin_zero[8] 填充對齊
};
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr = {0};
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(9734);
bind(server_fd, (struct sockaddr*)&addr, sizeof(addr));
listen(server_fd, 5);
while (1) {
int client_fd = accept(server_fd, NULL, NULL);
char ch;
read(client_fd, &ch, 1);
ch++; // 簡單業務:字元 +1
write(client_fd, &ch, 1);
close(client_fd);
}
return 0;
}
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr = {0};
addr.sin_family = AF_INET;
addr.sin_port = htons(9734);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
connect(sockfd, (struct sockaddr*)&addr, sizeof(addr));
char ch = 'A';
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
printf("Server 回應: %c\n", ch); // 輸出 B
close(sockfd);
return 0;
}
htons/htonl (主機→網絡), ntohs/ntohl (網絡→主機)。fcntl(fd, F_SETFL, O_NONBLOCK) 配合 select/poll/epoll 實現高並發。shutdown(fd, SHUT_WR) 發送 FIN,配合 read 返回 0 確認對端關閉。setsockopt 設置 SO_RCVTIMEO/SO_SNDTIMEO。epoll 邊緣觸發模式,寫出高併發 Server(2 週)。Socket 編程看似枯燥,實則是理解分佈式系統、微服務通信、高性能服務器的基石。建議在 Linux 環境下手敲所有代碼,抓包分析(Wireshark/tcpdump)每個數據包,感受網絡開發的「單調」中蘊含的精妙邏輯。