Re: [問題] winsock網路程式

看板Programming作者 (NEW)時間18年前 (2006/10/30 22:36), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/5 (看更多)
※ 引述《Devil.bbs@bbs.csie.ncku.edu.tw (璉璉)》之銘言: : ※ 引述《MLP2007.bbs@ptt.cc (NEW)》之銘言: : > 發現recv接收到的packet內容常常是錯誤的 : > 也就是和發送端丟出的內容不一致 : > 導致程式錯誤 : > 後來想說在send之前用Sleep來作delay : > 情況改善很多 : > 而且delay的時間越長 收到錯誤封包的機率越低 : 不完全了解你的意思。 : 我想你應該是一收到資料就開始處理,通常在這時候還沒收全,所以有了時間差才會 : 有影響... : 自定通訊協定時,應該要有溝通的方式,比如說先送位元陣列長度,在收資料時,去 : 檢查資料是否已達指定長度後再處理。 我的想法: 把socket設為block mode 若Data還沒收全 則程式會block在recv中 如果recv回傳為SOCKET_ERROR代表有錯誤 否則即代表buffer已經填好資料可以讀取了 這樣說對不對? 我的寫法大概如下 UINT FileReceiveThread(LPVOID pParam) //Receive Thread Function { struct Packet pak; REGET: do{ if(recv(sock, (char*) &pak, sizeof(struct Packet), 0) == SOCKET_ERROR) { // recv error return 0; } if(!strcmp(pak.type, IDENTIFY_STRING)) { //Correct Data Packet fwrite(pak.buffer, sizeof(char), pak.datasize, pFile); } else { //Wrong Data Packet goto REGET; } }while(pak.datasize == BUFFER_SIZE); } 請多指教. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.167.198.34
文章代碼(AID): #15HWtRYg (Programming)
文章代碼(AID): #15HWtRYg (Programming)