发送时: m_ClientSocket.Send((&struct_Ecc[n]),sizeof(struct_Ecc[n]),0);
接收时: Receive(buffer,BUFFER_SIZE,0);   //BUFFER_SIZE设为10000
现在接收时的数据会发生粘包现象,如果要加入校验判断 循环接收的话,程序应该怎么写呀?
有例程的话最好。

解决方案 »

  1.   

    bbs.chinacode.com
    会帮你解决问题。
      

  2.   

    TCP是流数据没有边界的,自己想办法标记记录的结束,比如在每个记录的前面方加一个二进制的计数值,标记本记录的长度,或者采用类似SMTP的回车,换行构成的2字节序列终止记录
      

  3.   

    接收时是调用RECEIVE()的,如果加入校验位的话,循环接收时的代码怎么写?
      

  4.   

    1)TCP/IP发送时候,无法确定是否一次性发送,即使几个时间发送的数据也会在同一时间接收,因此,在发送/接收方,需要做一个简单的协议,Example格式如下:
      协议头:2个字节 
      控制项目:2个字节
      数据长度:3个字节
      数据部分:。
      crc校验:
      协议结束;2个字节2)在接收数据的时候,需要进新如下处理
      a) 将接到的数据全部保存到一个大的缓冲区中,该缓冲区保存所有等待处理的数据;
      b) 从第一个等待处理的字节开始,找到协议头,验证格式,协议尾等,判断是否符合协议
    要求
      c> 符合要求,处理数据/save/...,删除处理完毕的缓冲区部分数据,准备新的待处理缓冲区;
      d) 不符合要求,缓冲区指针后移
      ...
      f) 循环b~d步骤,一直到接收的缓冲区处理完毕,结束循环。
      

  5.   

    if(*(buffer+1)=='E')       //发送时将结构体中的一个字段赋值为'E',接收时判断是否是此  结构体
    int EccLen=sizeof(struct_EccStor);
    memcpy(&(struct_EccStor),&buffer,EccLen);
    //处理接收到的数据
       ......这样处理后,为什么数据还是不正确呀?
      

  6.   

    // 拆解包二.cpp : 定义控制台应用程序的入口点。
    //#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;
    }
    }这是我写的一个,不过还是有一些问题.这里面就定义了一个数据包头.
      

  7.   

    http://www.vckbase.com/document/viewdoc/?id=1203
      

  8.   

    流没有粘包的说法的
    解决方法:
    1 使用协议层来防止
    2 使用阻塞+分解线程来实现
    3 使用非阻塞+预定义长度来实现
    4 叫BILL GATES们修改TCP/IP层的实现
      

  9.   

    "粘包"是无名氏创造的伪名词,TCP是流,谈不上粘不粘包
      

  10.   

    请以后不要动不动就说粘包,tcp是流的,你要自己定义包结构,包头,包体.