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

Muduo 實現 Boost.Asio 聊天服務器:分包處理與多線程入門

     編輯:關於C++

TCP 分包四大法

  1. 固定長度(如 Roundtrip 16 Bytes)。
  2. 特殊分隔符(HTTP \r\n)。
  3. 長度前綴(本文採用:4 Bytes Network-order Length + Body)。
  4. 自描述格式(XML/JSON 配對)。

聊天協議與編解碼

消息:uint32_t len (Big-Endian) + string body。
打包利用 Buffer::prepend(頭部預留 8 Bytes,零拷貝)。
解碼 LengthHeaderCodec::onMessage:

while (buf->readableBytes() >= kHeaderLen) {
    int32_t len = networkToHost32(*(int32_t*)buf->peek());
    if (len > 65536 || len < 0) { shutdown(); break; }
    if (buf->readableBytes() >= len + kHeaderLen) {
        buf->retrieve(kHeaderLen);
        string msg(buf->peek(), len);
        buf->retrieve(len);
        messageCallback_(conn, msg, receiveTime);
    } else break; // 等待更多数据
}

關鍵:while 處理粘包,if 會導致單次回調只處理一幀、數據堆積。

Codec 間接層

LengthHeaderCodec 將 Buffer* 回調轉為 const string& 回調,用戶代碼無需關心分包細節。Client/Server 復用同一 Codec。

服務端實現

  • std::set<TcpConnectionPtr> connections_ 保存所有連接,Mutex 保護。
  • onConnection:增刪 connections_。
  • onStringMessage:遍歷廣播 codec_.send(conn, msg)。
  • 代碼 < 100 行,較 Asio 版簡潔。

客戶端實現

雙線程:Main 線程讀 stdin,EventLoopThread 處理網絡 IO。write() 跨線程呼叫需鎖保護 shared_ptr。

代碼位置

examples/asio/chat/ (codec.h, chat_server.cc, chat_client.cc)

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