tigerjade说的很对,socket的默认缓冲区大小有限, 所以你一次收不完,如果你不想循环接受的话,用setsockopt把缓冲区设大一些。

解决方案 »

  1.   

    范例:设置接受缓冲区大小
    int nconst = 0x20000;//128k
    nret = ::setsockopt(s,
    SOL_SOCKET,
                                SO_RCVBUF,
    (const char *)&nconst,
    sizeof(nconst));
      

  2.   

    我觉得原因可能是多种多样的,因为在TCP打成IP包之后,会被拆开,因此一个比较大的TCP包会被拆成多个小的IP包,这样,每收到一个IP包就会读取产生一条OnReceive消息(具体消息是什么名字我忘了,暂时这么说吧),这时如果你只是读一次的话很可能数据不能一次收下来。
    我的意见是:
    在你的类里面专门定义一个变量,其中设置需要读取的字节数,每收到一次OnReceive消息,就把从中减去所收到的字符数。直到这个变量最后变为0,才表示所有需要收到的数据都收全了,这时才能进行下面的操作,否则只能继续等待OnReceive消息。
    你可以试试看,应当不是很复杂。