WsaSend重复发送大问题

dzz10 2012-12-05 05:58:55
我不知道这是个什么问题,直接上源代码:

bool CIOCPServer::PostSend( CClient *pClient, COverlappedEx *pOverlappedEx )
{
DWORD NumberOfBytesSent = 0;
int err = WSASend(pClient->sAccept, &pOverlappedEx->WsaBuf, 1, &NumberOfBytesSent, 0, &pOverlappedEx->Overlapped, 0);
if(SOCKET_ERROR == err){
err = WSAGetLastError();
if(err && WSA_IO_PENDING != err){
err = 0;
}else{
err = 1;
}
}else{
err = 1;
}

pOverlappedEx->WsaBuf.len = IOCPSERVER_DATABUFFLEN;
pOverlappedEx->ioType = io_write;
#if _DEBUG
char szBuff[1024];
sprintf_s(szBuff, "%d CIOCPServer::PostSend", GetCurrentThreadId());
PutString(szBuff);
#endif
return err > 0;
}


在DEBUG版本下运行,客户端发送一条数据给服务器,服务器调用PostSend函数发送一条数据,客户端接收到一条数据,RELEASE版的时候客户端就会无限收到数据.
注意:在DEBUG版本时注释掉以下代码客户端也会无限接收到数据

#if _DEBUG
char szBuff[1024];
sprintf_s(szBuff, "%d CIOCPServer::PostSend", GetCurrentThreadId());
PutString(szBuff);
#endif


难道是因为PostSend函叔返回太快???????????????????????
...全文
159 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dzz10 2012-12-11
  • 打赏
  • 举报
回复
引用 4 楼 xumaojun 的回复:
如果是这样,那无论是debug还是release你的程序应该都不会正常工作呀.
这个函数GetCurrentThreadId,我想它应该需要时间才能完成吧,所以会导致线程不会马上回去执行GetQueuedCompletionStatus函数,然而又是在本机测试,所以在debug就正常了。 还是谢谢您的回答。
xumaojun 2012-12-05
  • 打赏
  • 举报
回复
如果是这样,那无论是debug还是release你的程序应该都不会正常工作呀.
dzz10 2012-12-05
  • 打赏
  • 举报
回复
额,问题已经解决,但是还没有人来看 原因:由于我错误的使用了OVERLAPPED结构,发送和接收我用的同一个,所以就各种乱来! 修改: 在发送大时候新建COverlappedEx,在数据发送成功之后删除此对象.
dzz10 2012-12-05
  • 打赏
  • 举报
回复
坐等高手
dzz10 2012-12-05
  • 打赏
  • 举报
回复
自己顶一下子

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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