recv 接收时不能完整接收数据,是怎么回事呀

wxliangzyt 2013-12-16 08:53:06
发送的数据格式如下:

struct recvMsg
{
char sendtype[2];//数据类型
char sendno[30];//用户ID
char sendskt[10];//
char seda[100];//值1
char sedb[100];//值2
char sedc[100];//值3
char sedd[100];//值4
char sede[100];//值5
char sedf[100];//值6
char sedg[100];//值7
char sedh[100];//值8
char sedi[100];//值9
};
...............................
recvMsg rmg;
while(1)
{
....................................
send(s,(char*)&rmg,sizeof(rmg),0);
..................................
}


客户端也while接收

.....................
memset(szBuf,0,Recv_BUF_SIZE);
iRet = recv(pcs->m_ServerSocket,(char*)szBuf, Recv_BUF_SIZE, 0);
if (iRet>0)
{
if(szBuf != NULL && szBuf[0] != _T(''))
{
memcpy(&(csnt->rmgg),szBuf,sizeof((csnt->rmgg)));
EnterCriticalSection(&m_GetRecvData);
pcs->m_clist.AddTail(csnt);
LeaveCriticalSection(&m_GetRecvData);
}
}
....................................................


如果服务器while的间隔时间过短,客户端接收时会不完整,如果间隔1秒发送时,通常能接收完整的数据

请高人指点,如何解决
...全文
284 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuyf87 2013-12-17
  • 打赏
  • 举报
回复
可以自定义一个简单的协议吧,比如包头、包体长度、包体、校验、包尾。 接收到的数据保存到一个缓冲队列中去,然后再用一个专门的线程, 不断的从缓冲队列中取数据,一包一包解析处理。
  • 打赏
  • 举报
回复
你这个没有发收控制啊,你的client属于假的client 因为根本不是client请求了server,server才发数据 你这个属于主动上送传输,把发送速率调慢一点吧 我们做电力通信的CDT规约时,那个速度都才1200波特率
xian_wwq 2013-12-17
  • 打赏
  • 举报
回复
引用 4 楼 zhuyf87 的回复:
可以自定义一个简单的协议吧,比如包头、包体长度、包体、校验、包尾。 接收到的数据保存到一个缓冲队列中去,然后再用一个专门的线程, 不断的从缓冲队列中取数据,一包一包解析处理。
正解,要处理粘包,同时将数据接收与解析分离
hurryboylqs 2013-12-16
  • 打赏
  • 举报
回复
粘包,要循环接受,直到接收完毕,常识问题
wxliangzyt 2013-12-16
  • 打赏
  • 举报
回复
我这个是属于丢包,还是粘包呀

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧