我試圖通過TCP套接字發送數據塊。服務器代碼執行以下操作:從TCP套接字讀取錯誤的數據
#define CHECK(n) if((r=n) <= 0) { perror("Socket error\n"); exit(-1); }
int r;
//send the number of blocks
CHECK(write(sockfd, &(storage->length), 8)); //p->length is uint64_t
for(p=storage->first; p!=NULL; p=p->next) {
//send the size of this block
CHECK(write(sockfd, &(p->blocksize), 8)); //p->blocksize is uint64_t
//send data
CHECK(write(sockfd, &(p->data), p->blocksize));
}
在客戶端,我讀的大小,然後將數據(相同的檢查萬客隆):
CHECK(read(sockfd, &block_count, 8));
for(i=0; i<block_count; i++) {
uint64_t block_size;
CHECK(read(sockfd, &block_size, 8));
uint64_t read_in=0;
while(read_in < block_size) {
r = read(sockfd, data+read_in, block_size-read_in); //assume data was previously allocated as char*
read_in += r;
}
}
這隻要工作完全正常的客戶端和服務器在同一臺機器上運行,但只要我通過網絡嘗試完成,它在某些時候會失敗。特別是,第一300-400塊(A〜587字節)左右做工精細,但後來我得到一個不正確的block_size閱讀:
received block #372 size : 586
read_in: 586 of 586
received block #373 size : 2526107515908
然後它崩潰了,很明顯。 我的印象是TCP協議確保沒有數據丟失,並且所有信息都按正確的順序接收,但是考慮到它已經在本地工作,那麼這怎麼可能?我的錯誤在哪裏?
您是否檢查過服務器中的列表實際上是否有效?即'p-> next'對於最後一個節點是'NULL'。 –