C++ 完成端口模式(菜鸟问题 求指教)

aa6096858 2012-02-21 12:34:14
我网上找了个完成端口模式的例子,按照例子写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);//解锁进程
}
...全文
352 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2012-09-28
  • 打赏
  • 举报
回复
1楼真牛,专业考古啊。
「已注销」 2012-09-28
  • 打赏
  • 举报
回复
晕啊。。2月份的问题。。
「已注销」 2012-09-28
  • 打赏
  • 举报
回复
你直接读投递下一次接收了?然后再处理的数据。。
这样肯定会出错。。
大板牙花生 2012-09-27
  • 打赏
  • 举报
回复
我觉的是不是可以理解为不同的协议问题,TCP和UDP的区别,你是想实现TCP那样的效果,但实际上却是UDP的效果?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧