int tcpclient::onrecv()
else
}return error;
}void tcpclient::decoderecvbuffer()
decodeoffset += net_packet_head_len;
//從池子裡面取出長度為datalen的m_recievepacket(實際上就是乙個char[2048]的區域)的鑰匙(char*)(池子裡面是大於2k單獨new,小於就給你2k的)
//這個m_recievepacket就是我收到的資料報,用於還原tcpserver傳送的資料報,
m_recievepacket = m_bufferpool.pop(datalen);
m_recievepacket->settype(static_cast(packtype));
m_recievepacket->setproc(proc);
m_recievepacket->setsize(datalen);
m_decodestate = decode_data;
//頭部解析完,decodeoffset+=7,我已經處理了7個位元組,下面該處理訊息體了,m_decodestate置為decode_data
}// 處理訊息體 前提一定是m_recievepacket不為空,也就是上面頭部已經處理完,m_recievepacket也有了
//第一次就這樣,如果走這裡,說明前面的訊息體沒有處理完,這次接著處理,
if (m_decodestate == decode_data && m_recievepacket != null)
//如果沒有進入上面的if 說明訊息體部分沒有寫完,那麼while迴圈繼續把buffer裡面的內容往m_recievepacket裡面放}}
if (decodeoffset < m_recvoffset)
//正常情況下m_recvoffset-decodeoffset 回到起始位置,因為buffer裡面的內容已經處理完了
//但是比如 10-8=2,比如訊息體處理完,然後還有乙個訊息頭,但是長度只有2,明顯只接了一部分,那麼肯定是不處理,因此接收偏移為2
//下次從 2 這個偏移位置繼續接收訊息,連同前面buffer裡面剩的2位元組,湊夠7位元組在下回合處理
//訊息體沒接收完同理,
m_recvoffset = m_recvoffset - decodeoffset;
}
網路遊戲資料傳輸 粘包的處理
網路傳輸大體上包含這四個協議type area command message,這四層協議是依次向下傳遞的。所謂協議,說簡單點就是伺服器端和客戶端的乙個約定,比如,向伺服器傳送 1,0,1,賬號 密碼 約定type中1代表登入模組,因為登陸不需要經過area協議,所以跳過area協議,直接到comm...
網路遊戲中使用TCP處理粘包的兩種思路
將傳送資料封裝成包,就像tcp協議一樣加乙個包頭。使用分隔符,對傳送資料時在資料尾部加入分割符。第一種方式處理粘包,可以在要傳送資料的首部加2位元組大小的包頭儲存資料報的長度,在資料結束位置加乙個位元組的包尾用來校驗資料。校驗值等於迴圈資料的每個位元組按位異或的最終值。一般網路遊戲伺服器中比如手遊會...
處理TCP網路傳輸「粘包」疑難
在應用開發過程中,筆者發現基於tcp網路傳輸的應用程式有時會出現粘包現象 即傳送方傳送的若干包資料到接收方接收時粘成一包 針對這種情況,我們進行了專題研究與實驗。本文重點分析了tcp網路粘包問題,並結合實驗結果提出了解決該問題的對策和方法,供有關工程技術人員參考。一 tcp協議簡介 tcp是乙個面向...