读书人

关于socket通讯IOCP方面发送数据是不

发布时间: 2012-11-16 14:12:14 作者: rapoo

关于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 。

读书人网 >C++

热点推荐