我的理解就是tcp流因為他是乙個連續的,然後我們用360等工具我們每次看到傳送過來的資料是有變化的,所以我們會產生沒有接受完畢的資料報,或者接受了過多的情況,我們對這種情況叫做斷包活著粘包的情況。解決方案有很多種,我說一種最簡單的,增加頭子節的長度。**如下:
伺服器:
#include #include #include #include #include #include #include #include #include #define err_exit printf
//自定義封包的結構體
struct packet
;//1一次全部讀走 //2次讀完資料 //出錯分析 //對方已關閉
//思想:tcpip是流協議,不能保證1次讀操作,能全部把報文讀走,所以要迴圈讀指定長度的資料。
//按照count大小讀資料,
//若讀取的長度ssize_t0) //當剩餘需要讀取的個數》0
else if (nread == 0) //若對方已關閉
return count - nleft;
bufp += nread; //將 字串指標向後移動已經成功讀取個數的大小。
nleft -= nread; //需要讀取的個數=需要讀取的個數-以及成功讀取的個數
} return count;
}//1一次全部讀走 //2次讀完資料 //出錯分析 //對方已關閉
//思想:tcpip是流協議,不能1次把指定長度資料,全部寫完
//按照count大小寫資料
//若讀取的長度ssize_t0) //如果需要寫入的個數》0
//需要寫入的資料個數》0
//如果成功寫入的個數為0 則繼續
else if (nwritten == 0)
continue;
//將bufp指標向後移動已經
bufp += nwritten;
//剩餘個數
nleft -= nwritten;
} return count;
}void do_service(int conn)
//將網路資料轉換為本地資料結構,比如網路資料為大端,而本地資料為小端
n = ntohl(recvbuf.len);
//根據包頭裡包含的大小讀取資料
ret = readn(conn, recvbuf.buf, n); //根據長度讀資料
if (ret == -1)
err_exit("read");
//如果讀取的資料的大小小於封包包頭中包的大小,那麼客服端已經關閉
else if (ret < n)
//將資料列印出。
fputs(recvbuf.buf, stdout);
//將接受到的資料再直接發出去。
writen(conn, &recvbuf, 4 + n); //注意寫資料的時候,多加4個位元組 }}
int main(void)
else
close(conn);
} return 0;
}
客戶端
#include #include #include #include #include #include #include #include #include #define err_exit printf
//定義自定義封裝包
struct packet
;ssize_t readn(int fd, void *buf, size_t count)
else if (nread == 0)
return count - nleft;
bufp += nread;
nleft -= nread;
} return count;
}ssize_t writen(int fd, const void *buf, size_t count)
else if (nwritten == 0)
continue;
bufp += nwritten;
nleft -= nwritten;
} return count;
}int main(void)
//將轉換為本地位元組儲存
n = ntohl(recvbuf.len);
ret = readn(sock, recvbuf.buf, n);
if (ret == -1)
err_exit("read");
else if (ret < n)
fputs(recvbuf.buf, stdout);
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
} close(sock);
return 0;
}
Go程式設計學習第六天
在go語言中函式定義格式如下 func 函式名 引數列表 返回值型別 中括號內是可選引數eg func getsum num1 int,num2 int int 值傳遞 在函式呼叫過程中將實參拷貝乙份到函式中,這樣在函式中如果對引數進行修改,將不會影響到實參 引用傳遞 在函式呼叫過程中將實參的位址傳...
第六天學習
變數的作用域 區域性變數 在函式內部定義的變數,這個變數只能在函式內部使用,在全域性當中不能使用。使用就報錯了。全域性變數 在函式外部定義的變數,這個變數可以在全域性使用。但是我們一般不推薦使用全域性變數 因為可能會意外的修改掉變數的值。迫不得已不要用全域性變數 衝突處理原則 就近原則。而不是從上到...
學習第六天
還有九天,我就要去參加北大3日遊了。滑稽 像我這樣的蒟蒻去那也就是旅遊模式吧!無所謂了,隨便去考考,說不定有優秀營員呢?滑稽 不可能,絕對不可能 相信自己好了。這麼多天,好像把面試給忘了,雖然有人說面試是瞎 但是還是要準備準備的 明天看吧!還有什麼知識點沒看嗎?我們來看看st表和hash表吧!先看看...