发送时: m_ClientSocket.Send((&struct_Ecc[n]),sizeof(struct_Ecc[n]),0);
接收时: Receive(buffer,BUFFER_SIZE,0); //BUFFER_SIZE设为10000
现在接收时的数据会发生粘包现象,如果要加入校验判断 循环接收的话,程序应该怎么写呀?
有例程的话最好。
接收时: Receive(buffer,BUFFER_SIZE,0); //BUFFER_SIZE设为10000
现在接收时的数据会发生粘包现象,如果要加入校验判断 循环接收的话,程序应该怎么写呀?
有例程的话最好。
解决方案 »
- 我动态的调试窗口透明度无法实现 我是动态创建窗口的 在CFormView类的窗口中创建的
- 怎么样判断一个菜单项是否有子菜单
- 关于窗口重绘和动态菜单的问题。
- 哪里可以下载《vc++技术内幕》和《深入浅出MFC》?
- 为什么我的一个可以运行的对话框程序在简单拖入一个MS COMMUNICATION CONTROL后,再运行就出现不了以前的画面了(什么画面也不出现)?
- 为何这样获取不了PeekMessage的地址?
- 如何调用IE浏览器并直接打开某个网页?麻烦您帮忙解答一下,谢谢。
- DOS命令
- 用vs2008一个火大的地方 求解
- CDialog 继承类问题
- 请问 如何给CLongBinary类型的数据赋值
- 为什么我在处理WM_NCPAINT时............
会帮你解决问题。
协议头:2个字节
控制项目:2个字节
数据长度:3个字节
数据部分:。
crc校验:
协议结束;2个字节2)在接收数据的时候,需要进新如下处理
a) 将接到的数据全部保存到一个大的缓冲区中,该缓冲区保存所有等待处理的数据;
b) 从第一个等待处理的字节开始,找到协议头,验证格式,协议尾等,判断是否符合协议
要求
c> 符合要求,处理数据/save/...,删除处理完毕的缓冲区部分数据,准备新的待处理缓冲区;
d) 不符合要求,缓冲区指针后移
...
f) 循环b~d步骤,一直到接收的缓冲区处理完毕,结束循环。
int EccLen=sizeof(struct_EccStor);
memcpy(&(struct_EccStor),&buffer,EccLen);
//处理接收到的数据
......这样处理后,为什么数据还是不正确呀?
//#include "stdafx.h"char buf_[1024];
int nUseSize_;
#pragma pack(push,1)
struct Head {
int nSize;
};
#pragma pack(pop)
void neagle(char *buff,int nSize);
int _tmain(int argc, _TCHAR* argv[])
{
char buff[10];
Head *pHead=(Head*)buff;
pHead->nSize=sizeof(Head)+3;
char *p=(char*)(pHead+1);
memcpy(p,"111",3);
nUseSize_=0;
Head *pHead2=(Head*)&buff[7];
pHead2->nSize=sizeof(Head)+3;
neagle(buff,pHead->nSize+sizeof(Head)); buff[0]='A';
buff[1]='A';
buff[2]='\0';
neagle(buff,1);
neagle(buff+1,2);
return 0;
}void neagle(char *buff,int size)
{
char *pCheck=0;
int nSize=0;
// 是否需要处理断包
if (nUseSize_==0)
{
pCheck=buff;
nSize=size;
}
// 需要
else
{
memcpy(buf_+nUseSize_,buff,size);
pCheck=buf_;
nSize=nUseSize_+size;
nUseSize_=0;
} //开始查找此内存块
int offset=0;
while (offset!=nSize)
{
// 头长度都没有满
if (nSize-offset<sizeof(Head))
{
break;
}
else
{
// 让头指针指向offset
Head *pHead=(Head*)(&(pCheck[offset]));
if (pHead->nSize<=nSize-offset)
{
// 移动offset
offset+=pHead->nSize;
}
// 没有完整的数据包体
else
{
break;
}
}
} // 如果offset没有查找完,就要保存下来.
if (offset<nSize)
{
memcpy(buf_,pCheck+offset,nSize-offset);
nUseSize_=nSize-offset;
}
}这是我写的一个,不过还是有一些问题.这里面就定义了一个数据包头.
解决方法:
1 使用协议层来防止
2 使用阻塞+分解线程来实现
3 使用非阻塞+预定义长度来实现
4 叫BILL GATES们修改TCP/IP层的实现