\r\n)。消息: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 會導致單次回調只處理一幀、數據堆積。
LengthHeaderCodec 將 Buffer* 回調轉為 const string& 回調,用戶代碼無需關心分包細節。Client/Server 復用同一 Codec。
std::set<TcpConnectionPtr> connections_ 保存所有連接,Mutex 保護。onConnection:增刪 connections_。onStringMessage:遍歷廣播 codec_.send(conn, msg)。雙線程:Main 線程讀 stdin,EventLoopThread 處理網絡 IO。write() 跨線程呼叫需鎖保護 shared_ptr。
examples/asio/chat/ (codec.h, chat_server.cc, chat_client.cc)