使用WSASend后导致GetQueuedCompletionStatus多次返回

yangyanzhao 2017-07-20 04:25:37
errorInfo CIOCPModel::Send(PER_IO_CONTEXT* pIoContext, SOCKET socket, char* strBuff, int offset, int length){
errorInfo back;
int result = -1;
int temp = strlen((char*)strBuff);
int err = 0;
WSABUF DataBuf;
DWORD SendBytes, Flags;
char buffer[1024];

DataBuf.len = length;
DataBuf.buf = strBuff;
pIoContext->m_Overlapped.hEvent = WSACreateEvent();
result = WSASend(socket, &DataBuf,1, &SendBytes, 0, &pIoContext->m_Overlapped, NULL);
DWORD a = GetLastError();

//result = send(socket, (const char*)(char*)strBuff, strlen((char*)strBuff) + 1, 0);
if (result < 0){
if (WSAGetLastError() != ERROR_IO_PENDING)
{
DWORD a = WSAGetLastError();
str.Format("WSASend failed!,errorcode=%d\n", WSAGetLastError());
logFile.write(str, str.GetLength());
//printf("WSASend() failed with error %d\n", WSAGetLastError());
}
back.errorCode = WSAGetLastError();
back.errorStr = "send error";
}
else{
back.errorCode = 0;
}
_PostSend(pIoContext);
return back;


发送后,GetQueuedCompletionStatus多次返回,除第一个消息是正确的外,其他都为空,不知道是什么原因
...全文
228 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
亚细亚 2021-06-28
  • 打赏
  • 举报
回复

我也遇到同样的问题,不知哪里出了问题?

yangyanzhao 2017-07-21
  • 打赏
  • 举报
回复
PER_IO_CONTEXT* pNewIoContext = pSocketContext->GetNewIoContext(); pNewIoContext->m_OpType = RECV_POSTED; pNewIoContext->m_sockAccept = pSocketContext->m_Socket; pNewIoContext->m_Overlapped = pIoContext->m_Overlapped; if (strcmp(pIoContext->m_szBuffer, "register") == 0){ this->_ShowMessage(_T("message from %s port %d:%s\n"), inet_ntoa(ClientAddr->sin_addr), ntohs(ClientAddr->sin_port), pNewIoContext->m_szBuffer); //printf("message from %s port %d:%s\n", inet_ntoa(ClientAddr->sin_addr), ntohs(ClientAddr->sin_port), pNewIoContext->m_szBuffer); str.Format("message from %s port %d:%s\n", inet_ntoa(ClientAddr->sin_addr), ntohs(ClientAddr->sin_port), pNewIoContext->m_szBuffer); logFile.write(str, str.GetLength()); sprintf(pThis->pThis->sendBuf, "registered :%d:", index2); pThis->pThis->registered[index2] = true; pThis->pThis->m_bHeart[index2] = true; pThis->pThis->Send(pNewIoContext, pNewIoContext->m_sockAccept, pThis->pThis->sendBuf, 0, strlen(pThis->pThis->sendBuf) + 1); } 这是我调用SEND的地方
yangyanzhao 2017-07-21
  • 打赏
  • 举报
回复
PER_IO_CONTEXT* pNewIOContext = pSocketContext->GetNewIoContext(); pNewIOContext->m_OpType = RECV_POSTED; pNewIOContext->m_sockAccept = pIoContext->m_sockAccept; memcpy(pNewIOContext->m_szBuffer, pIoContext->m_szBuffer, MAX_BUFFER_LEN); switch( pIoContext->m_OpType ) { // Accept case ACCEPT_POSTED: { // 为了增加代码可读性,这里用专门的_DoAccept函数进行处理连入请求 pIOCPModel->_DoAccept( pSocketContext, pIoContext ); } break; // RECV case RECV_POSTED: { // 为了增加代码可读性,这里用专门的_DoRecv函数进行处理接收请求 //pIOCPModel->_DoRecv( pSocketContext,pIoContext ); pIOCPModel->_DoRecv(pSocketContext, pNewIOContext); } break; 我新建了PER_IO_CONTEXT结构,但问题似乎并没有解决
zgl7903 2017-07-20
  • 打赏
  • 举报
回复
1 WSACreateEvent 应该有配对的 WSACloseEvent 2 (WSAGetLastError() == ERROR_IO_PENDING) 时 建议 WSAGetOverlappedResult
oyljerry 2017-07-20
  • 打赏
  • 举报
回复
http://blog.csdn.net/smartfox80/article/details/41823101

18,356

社区成员

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

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