关于socket通讯IOCP方面,发送数据是不是粘包了?
关于socket通信IOCP方面,发送数据是不是粘包了???
第一次 客户端 发送 “111” 服务端收到 是 “111”
第二次 客户端 发送 “222” 服务端收到 是 “222”
第二次 客户端 发送 “3” 服务端收到 是 “322”
我发送第三次数据时候 接受数据这么不对啊?? 本人菜鸟希望大家指点下
顺便贴下 IOCP工作线程函数代码
------解决方案--------------------
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://topic.****.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
------解决方案--------------------
粘包肯定是要处理的,但是楼主这里的问题貌似是重新接收之前没有把缓冲区置零,又没有用返回的真实接收长度来控制输出,直接用了一个cout,必然会把上次接收到的数据重复输出
------解决方案--------------------
//处理数据
cout<<PerIoData->DataBuf.buf << endl;
直接将原缓冲区的内容全部输出,如4楼所言,未用返回的接收长度来操作相应的数据,导致缓冲区全部数据输出.如果发送"1111",则将覆盖原缓冲区的3个字符内容,按照现在的方式就会输出正确结果.
------解决方案--------------------
你这个不是粘包吧,是接收缓存没清0 。
第一次 客户端 发送 “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.****.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
------解决方案--------------------
粘包肯定是要处理的,但是楼主这里的问题貌似是重新接收之前没有把缓冲区置零,又没有用返回的真实接收长度来控制输出,直接用了一个cout,必然会把上次接收到的数据重复输出
------解决方案--------------------
//处理数据
cout<<PerIoData->DataBuf.buf << endl;
直接将原缓冲区的内容全部输出,如4楼所言,未用返回的接收长度来操作相应的数据,导致缓冲区全部数据输出.如果发送"1111",则将覆盖原缓冲区的3个字符内容,按照现在的方式就会输出正确结果.
------解决方案--------------------
你这个不是粘包吧,是接收缓存没清0 。