作者MLP2007 (NEW)
看板Programming
标题Re: [问题] winsock网路程式
时间Mon Oct 30 23:00:07 2006
※ 引述《[email protected] (琏琏)》之铭言:
: ※ 引述《[email protected] (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