关于socket通讯IOCP方面,发送数据是不是粘包了?

关于socket通信IOCP方面,发送数据是不是粘包了???
第一次 客户端 发送 “111” 服务端收到 是 “111”
第二次 客户端 发送 “222” 服务端收到 是 “222”
第二次 客户端 发送 “3” 服务端收到 是 “322”


我发送第三次数据时候 接受数据这么不对啊?? 本人菜鸟希望大家指点下


顺便贴下 IOCP工作线程函数代码

C/C++ code


//创建线程函数
DWORD WINAPI ServerWorkerThread(LPVOID lpParam)
{
    HANDLE CompletionPort = (HANDLE)lpParam;
    DWORD ByresTransferred;
    LPOVERLAPPED lpOverlapped;
    LPPER_HANDLE_DATA PerHandleData = NULL;
    //LPPER_IO_DATA PerHandleData = NULL;
    LPPER_IO_DATA PerIoData = NULL;

    DWORD SendBytes;
    DWORD RecvBytes;
    DWORD Flags;
    BOOL bRet = FALSE;

    while (TRUE)
    {
        bRet = GetQueuedCompletionStatus(CompletionPort,
                                         &ByresTransferred,                    //的I/O操作所传送数据的字节数
                                         (PULONG_PTR)&PerHandleData,        //用于存放与之关联的Completion键
                                         (LPOVERLAPPED*)&lpOverlapped,
                                          INFINITE);
        if(!bRet)
        {
            closesocket(PerHandleData->Socket);
            ::GlobalFree(PerHandleData);
            ::GlobalFree(PerIoData);
            cout<< "发生错误! error" << bRet <<endl;
            continue;
        }

        //先检查一下,看看是否套接字有错误发生
        if(0 == ByresTransferred)
        {
            closesocket(PerHandleData->Socket);
            ::GlobalFree(PerHandleData);
            ::GlobalFree(PerIoData);

            continue;
        }
        //处理数据
        cout<<PerIoData->DataBuf.buf << endl;
        Flags = 0;

        //清空,准备下个I/O数据
        ZeroMemory(&(PerIoData->Overlapped),sizeof(OVERLAPPED));

        PerIoData->DataBuf.len = 1024;
        PerIoData->DataBuf.buf = PerIoData->buffer;
        PerIoData->OperationType = 0; //read
        
        WSARecv(PerHandleData->Socket,
                &(PerIoData->DataBuf),   //接受缓存区
                1,
                &RecvBytes,                 //接受字节数
                &Flags,
                &(PerIoData->Overlapped),//绑定重叠结构
                NULL);
    }

    return 0 ;
}






------解决方案--------------------
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html

------解决方案--------------------
粘包肯定是要处理的,但是楼主这里的问题貌似是重新接收之前没有把缓冲区置零,又没有用返回的真实接收长度来控制输出,直接用了一个cout,必然会把上次接收到的数据重复输出
------解决方案--------------------
//处理数据
cout<<PerIoData->DataBuf.buf << endl;
直接将原缓冲区的内容全部输出,如4楼所言,未用返回的接收长度来操作相应的数据,导致缓冲区全部数据输出.如果发送"1111",则将覆盖原缓冲区的3个字符内容,按照现在的方式就会输出正确结果.
------解决方案--------------------
你这个不是粘包吧,是接收缓存没清0 。