C++ 完成端口模式(菜鸟问题 求指教)
我网上找了个完成端口模式的例子,按照例子写C++完成端口模式的服务器。现在出现一个问题,当客户端同一时间发送大量数据包时,服务端接收数据包出现异常。
客户端:
SocketManager.getInstance().sendData("a");
SocketManager.getInstance().sendData("b");
SocketManager.getInstance().sendData("c");
SocketManager.getInstance().sendData("d");
SocketManager.getInstance().sendData("e");
服务端:
第一次收到数据包 读取为"b","c","d","e" 拼接起来的数据包
第二次收到数据包 读取为"b","c","d","e" 拼接起来的数据包
自己感觉是客户端数据发太快,当服务端受到“a”这个包,开始读取的时候,后面4个数据包也已经发至服务端,第一次错误的读取了后面4个数据包(“bcde”),读取完毕时又提示有新的数据包,又开始读取一次数据包(“bcde”)。
不知道我描述的清楚了没。。。。希望大家帮我看看问题出在那
服务端接收逻辑为
while(TRUE)
{
BOOL bOK = ::GetQueuedCompletionStatus(hCompletion, &dwTrans, (LPDWORD)&pPerHandle, (LPOVERLAPPED*)&pPerIO, WSA_INFINITE);
EnterCriticalSection(&g_cs); //锁进程
pPerIO->buf[dwTrans] = '\0';
buf.buf = pPerIO->buf ;
buf.len = BUFFER_SIZE;
DWORD nFlags = 0;
WSARecv(pPerHandle->s, &buf, 1, &dwTrans, &nFlags, &pPerIO->ol, NULL);
//读取指定长度 进行一些逻辑操作
readByteArray.writeBytes(pPerIO->buf, 0, dwTrans);
。
。
。
LeaveCriticalSection(&g_cs);//解锁进程
}