Re: [問題] winsock網路程式
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 5 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章