首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言 Socket 編程指南:從入門到 Linux 網絡開發實戰

     編輯:關於C語言

Socket 編程:Linux 系統編程的核心技能

Socket 是網絡通信的基石,也是 Linux 後端開發的必經之路。本指南基於 CentOS 實測,涵蓋從基礎 API 到完整 Client/Server 架構的核心知識體系,旨在帶你走進 Linux 網絡開發的大門。

核心 API 調用流程圖解

Server 端:被動等待連接

socket() → bind() → listen() → accept() → read/write() → close()
                    ↑_____________while(1)_____________|
  • socket():創建通信端點,返回文件描述符。
  • bind():綁定 IP:Port,INADDR_ANY 監聽所有網卡。
  • listen():轉為被動模式,第二參數為已完成連接隊列長度。
  • accept():阻塞等待客戶端,返回新 socket 專用於該連接。

Client 端:主動發起連接

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] 填充對齊
};

實戰代碼骨架

Server 端 (server.c)

#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;
}

Client 端 (client.c)

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 實現高並發。
  • 粘包/拆包:TCP 是流式協議,應用層需自定義協議(定長、分隔符、長度前綴)處理邊界。
  • 優雅關閉:shutdown(fd, SHUT_WR) 發送 FIN,配合 read 返回 0 確認對端關閉。
  • 超時設置:setsockopt 設置 SO_RCVTIMEO/SO_SNDTIMEO。

學習路線建議

  1. 熟練掌握上述基礎 API 與雙向通信流程(1 週)。
  2. 實現簡易 HTTP Server / Echo Server(1 週)。
  3. 學習 epoll 邊緣觸發模式,寫出高併發 Server(2 週)。
  4. 研究開源項目:nginx、redis、libevent 源碼中的網絡模塊。

總結

Socket 編程看似枯燥,實則是理解分佈式系統、微服務通信、高性能服務器的基石。建議在 Linux 環境下手敲所有代碼,抓包分析(Wireshark/tcpdump)每個數據包,感受網絡開發的「單調」中蘊含的精妙邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved