我桌面的兩個行程采用套接字進行行程間通信,用的是TCP協議,然后資料包是頭部4位元組(表示資料body大小)+ body
read函式每次先讀取4個位元組,然后這4個位元組就能確定body的大小,再接著讀取body長度的位元組,大部分時候都作業得很好。
//偽代碼
Packet{
BYTE head[4];
char *body;
uint length() { return head轉換的整數; };
}
//read回圈
while (1) {
Packet p;
int nRead = read(fd, p.head, ..4);
if (nRead == 4) {
uint length = p.length();
p.body = malloc(p.length());
int nRead = read(fd, p.body, ..length);
// handle body data
// free body
}
}
然而有的時候,read會出現讀取頭部4個位元組后,并沒有讀完body長度的位元組,read好像就回傳了,然后下一次再讀取4個位元組時,讀取的就是上一次body里面殘留的位元組,于是會得到錯誤的length(通常是幾十億。。。),引起malloc/new崩潰。
現在的問題是,怎樣的情況會導致read還沒讀取完指定的位元組數就回傳,我記得linux中的signal信號會引起read回傳?windows中呢?這個可能是因為除錯的原因嗎? 還是說代碼本來就有問題,沒有處理好所有Socket Tcp通信中的突然情況?
uj5u.com熱心網友回復:
TCP通信代碼啊,沒搞過,學習一下uj5u.com熱心網友回復:
粘包了,讀完頭4位元組得到長度以后,開辟一個指定長度的buffer,一直讀到buffer滿,才算一個包結束,這時才能開始你的業務。形如這樣:
(head)(bo
dy)(head)(bod
y)
應該在head后面讀入定長的body才算完成讀取。
另外,緊跟著的4個位元組又是新的包了,需要進入新的業務邏輯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/18773.html
標籤:Windows客戶端使用
上一篇:求救!!!!電腦可能中病毒了
下一篇:win10 以太網識別不出
