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

Linux 網絡編程實戰:基於 UDP 協議實現群聊服務器與客戶端

     編輯:關於C語言

Linux 網絡編程實戰:基於 UDP 協議實現群聊服務器與客戶端

本文設計基於 UDP 的群聊系統:客戶端發送消息到服務器,服務器廣播給所有在線客戶端。對比前作基於管道/select 的進程間通信,本文採用 Socket API 實現網絡級通信。

需求分析

  • 客戶端 ↔ 服務器:UDP 數據報通信
  • 服務器維護在線客戶端列表(鏈表)
  • 消息類型:上線通知、下線通知、聊天內容
  • 服務器使用 select 輪詢監聽 Socket

核心數據結構

typedef struct sockaddr_in SA;

typedef struct client_tag {
    SA ct_addr;              // 客戶端地址信息
    struct client_tag* ct_next;
} CNODE, *pcNODE;            // 客戶端鏈表節點

#define TYPE_ON   1
#define TYPE_OFF  2
#define TYPE_CHAT 3
#define SIZE      1024

typedef struct msg_tag {
    int msg_type;            // 消息類型
    int msg_len;             // 實際長度
    char msg_buf[SIZE];      // 消息內容
} MSG, *pMSG;

服務器邏輯流程

  1. 創建 UDP Socket,綁定固定端口(已知地址)
  2. 初始化客戶端鏈表為空
  3. select 監聽 Socket 可讀事件
  4. 收到數據:recvfrom 獲取發送端地址與 MSG 結構
  5. 按 msg_type 處理:
    • TYPE_ON:將客戶端地址加入鏈表
    • TYPE_OFF:從鏈表移除
    • TYPE_CHAT:遍歷鏈表 sendto 廣播給所有客戶端
  6. 循環返回 select

關鍵代碼框架

// 服務器主循環
while(1) {
    FD_ZERO(&readfds);
    FD_SET(sockfd, &readfds);
    timeout.tv_sec = 1; timeout.tv_usec = 0;
    
    int ret = select(sockfd+1, &readfds, NULL, NULL, &timeout);
    if(ret <= 0) continue; // 超時或錯誤
    
    if(FD_ISSET(sockfd, &readfds)) {
        socklen_t addrlen = sizeof(SA);
        MSG msg;
        SA cli_addr;
        recvfrom(sockfd, &msg, sizeof(MSG), 0, (struct sockaddr*)&cli_addr, &addrlen);
        
        switch(msg.msg_type) {
            case TYPE_ON:  add_client(&head, cli_addr); break;
            case TYPE_OFF: del_client(&head, cli_addr); break;
            case TYPE_CHAT: broadcast(sockfd, head, &msg, cli_addr); break;
        }
    }
}

客戶端邏輯

  • 啟動時發送 TYPE_ON 到服務器
  • 創建接收線程:循環 recvfrom 顯示消息
  • 主線程:讀取標準輸入,發送 TYPE_CHAT
  • 退出時發送 TYPE_OFF

UDP 群聊 vs TCP 群聊

工程化補充

  • 消息序列化:結構體直接傳輸需注意字節序、對齊、版本兼容
  • 客戶端超時清理:服務器定時檢查心跳,移除僵死節點
  • 緩衝區管理:SIZE 限制最大消息,防止溢出
  • 錯誤處理:sendto/recvfrom 返回值檢查,EINTR 重試
  • 擴展:支持私聊、群組、文件傳輸(分片)、加密(DTLS)

代碼完整實現將在後續文章給出。掌握 UDP 群聊模型,是理解即時通訊系統、遊戲同步、IoT 廣播等場景的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性UDP 方案TCP 方案
連接管理無連接,靠應用層心跳/上下線包長連接,斷開即下線
可靠性應用層實現 ACK/重傳(可選)內建可靠傳輸
廣播效率單發多收,需遍歷發送同樣需遍歷
NAT 穿透較易配合 STUN/TURN需保持連接
適用場景局域網、弱實時性、廣播業務可靠性要求高、長連接業務