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

揭開 Socket 編程面紗(三):C++ 服務端啟動與收發封裝

     編輯:關於C語言

服務端初始化 Socket、綁定地址、啟動監聽線程;通用 Send/Receive 封裝處理 TCP 流式特性導致的發送/接收不完全問題。

服務端啟動代碼


void CServerDlg::OnStart()
{
    sockaddr_in local = { AF_INET, htons(2000), INADDR_ANY };
    m_Listening = socket(AF_INET, SOCK_STREAM, 0);
    if (m_Listening == INVALID_SOCKET) return;

    if (bind(m_Listening, (sockaddr*)&local, sizeof(local)) == SOCKET_ERROR)
    {
        closesocket(m_Listening); return;
    }

    DWORD threadId;
    m_hListenThread = CreateThread(NULL, 0, ListenThread, this, 0, &threadId);
    // UI 按鈕狀態切換...
}

收發封裝函數


int Receive(SOCKET fd, char* buf, int len)
{
    int cnt = len, rc;
    while (cnt > 0)
    {
        rc = recv(fd, buf, cnt, 0);
        if (rc == SOCKET_ERROR) return -1;
        if (rc == 0) return len - cnt; // 對端關閉
        buf += rc; cnt -= rc;
    }
    return len;
}

int Send(SOCKET fd, char* buf, int len)
{
    int cnt = len, rc;
    while (cnt > 0)
    {
        rc = send(fd, buf, cnt, 0);
        if (rc == SOCKET_ERROR) return -1;
        if (rc == 0) return len - cnt;
        buf += rc; cnt -= rc;
    }
    return len;
}

設計要點

  • bind 使用 INADDR_ANY 綁定所有網卡,htons 確保端口網絡字節序。
  • 監聽佇列長度 40,足夠應對並發衝擊。
  • Send/Receive 循環讀寫,解決「粘包/拆包」導致的單次調用不完全問題。
  • 固定 100 字節收發簡化演示,實際協議需定義長度前綴或分隔符。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved