我在CAsyncSocket的OnReceive函数中读取数据。我并不想一次将数据读取完全,因为不能确定数据的大小。我多次用Receive来读取数据,怎样判断数据读取完毕?

解决方案 »

  1.   

    1.自己编协议,控制长度。
    2.判断receive返回值是否为WSAEMSGSIZE,说明还有数据。
      

  2.   

    typedef PKHEAD{
        DWORD dwType;
        DWORD dwLength;
    }PKHEAD;
    先读一个sizeof(PKHEAD),根据得到的dwLength读后面的数据。
      

  3.   


    “我并不想一次将数据读取完全,因为不能确定数据的大小”?????我不大懂也,Receive函数中可以确定你接受到了多少数据啊,为什么你不要一次把他都取完?不是没事找事么?估计你的情况是,发送数据的时候没有发送完整的一包,所以你认为Receive函数不能确定过来的数据时不是完整的,这也好办啊,在你认为是完整的一包的时候,在末尾添加一个数据中不可能存在的结尾标识,Receive函数每次都要检查最后几个数据是否有结尾标志,有的话,就认为接收玩毕。最后谈一谈结尾标志怎么定,对于字符串,可以使用'\0'作为结尾标志,因为字符串中不可能出现'\0',如果你是不确定的数据的话,就要稍微麻烦一点了,不能再用'\0'作为结尾标志了,因为你报文中可能有'\0',我认为你可以在每次发送数据的末尾都添加一个标识,比如0x55,如果这包数据是完整的一包,可以把标识改城0xaa,接收的时候判断一下末尾,如果为0x55,则把这个末尾标志去掉,如果是0xaa,则现在一包接收完毕了很多规约都是这样的思想,好好学学吧