完成端口的问题

yangyanzhao 2017-07-24 08:20:44
PER_SOCKET_CONTEXT* pNewSocketContext = new PER_SOCKET_CONTEXT;
pNewSocketContext->m_Socket = pIoContext->m_sockAccept;
//memcpy(&(pNewSocketContext->m_ClientAddr), ClientAddr, sizeof(SOCKADDR_IN));

PER_IO_CONTEXT* pNewIOContext = pNewSocketContext->GetNewIoContext();
//PER_IO_CONTEXT* pNewIOContext;
pNewIOContext->m_OpType = RECV_POSTED;
//pNewIOContext->m_OpType = ACCEPT_POSTED;
pNewIOContext->m_sockAccept = pIoContext->m_sockAccept;
memcpy(pNewIOContext->m_szBuffer, pIoContext->m_szBuffer, MAX_BUFFER_LEN);
memset(&pNewIOContext->m_Overlapped, 0, sizeof(OVERLAPPED));

以上代码运行一段时间后就出现内存错误
_PER_IO_CONTEXT* GetNewIoContext()
{
_PER_IO_CONTEXT* p = new _PER_IO_CONTEXT;

m_arrayIoContext.Add( p );

return p;
}
申请不到内存
...全文
274 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyanzhao 2017-08-02
  • 打赏
  • 举报
回复
PER_IO_CONTEXT* pNewIOContextSend = pSocketContext->GetNewIoContextSend(); switch( pIoContext->m_OpType ) { // Accept case ACCEPT_POSTED: { // 为了增加代码可读性,这里用专门的_DoAccept函数进行处理连入请求 pIOCPModel->_DoAccept(pSocketContext, pNewIOContextSend, pIoContext); /*if (pNewIOContextSend->m_sockAccept != INVALID_SOCKET){ pSocketContext->RemoveContextSend(pNewIOContextSend); }*/ //pIOCPModel->_RemoveContext(pSocketContext); //pSocketContext->RemoveContext(pNewIOContext); //pIOCPModel->_DoAccept(pSocketContext, pNewIOContext, pIoContext); } break; // RECV case RECV_POSTED: { // 为了增加代码可读性,这里用专门的_DoRecv函数进行处理接收请求 //pIOCPModel->_DoRecv( pSocketContext,pIoContext ); pIOCPModel->_DoRecv(pSocketContext,pNewIOContextSend, pIoContext); /*if (pNewIOContextSend->m_sockAccept!=INVALID_SOCKET){ pSocketContext->RemoveContextSend(pNewIOContextSend); }*/ //pIOCPModel->_RemoveContext(pSocketContext); //pSocketContext->RemoveContext(pNewIOContext); } break; // SEND // 这里略过不写了,要不代码太多了,不容易理解,Send操作相对来讲简单一些 case SEND_POSTED: { /*pNewIOContext->m_OpType = SEND_POSTED; pNewIOContext->m_sockAccept = pIoContext->m_sockAccept; memcpy(pNewIOContext->m_szBuffer, pIoContext->m_szBuffer, MAX_BUFFER_LEN); memset(&pNewIOContext->m_Overlapped, 0, sizeof(OVERLAPPED)); pNewIOContext->totalByte = length; pIoContext->m_OpType = SEND_POSTED;*/ if (dwBytesTransfered < pIoContext->totalByte){ pIOCPModel->Send(pSocketContext, pNewIOContextSend, pIoContext, pIoContext->m_sockAccept, pIoContext->m_szBuffer + dwBytesTransfered, 0, pIoContext->totalByte - dwBytesTransfered); } pSocketContext->RemoveContextSend(pNewIOContextSend); //WSACloseEvent(pNewIOContext->m_Overlapped.hEvent); //pSocketContext->RemoveContext(pNewIOContext); //WSAResetEvent(pIoContext->m_Overlapped.hEvent); //WSASend(pIoContext->m_sockAccept, &pIoContext->m_szBuffer, ); } break; default: // 不应该执行到这里 TRACE(_T("_WorkThread中的 pIoContext->m_OpType 参数异常.\n")); timeStr = pIOCPModel->GetTimeStr(timeStr1); pIOCPModel->str.Format("%s workthread %d pIoContext->m_OpType unknown!\n", timeStr.c_str(),nThreadNo); pIOCPModel->logFile.write(pIOCPModel->str, pIOCPModel->str.GetLength()); break; } //switch 还是有句柄泄露
赵4老师 2017-07-27
  • 打赏
  • 举报
回复
yangyanzhao 2017-07-26
  • 打赏
  • 举报
回复
数据处理完成后释放后出1236错误,工作线程GetQueuedCompletionStatus返回出错退出了。。。
xian_wwq 2017-07-26
  • 打赏
  • 举报
回复
引用 7 楼 yangyanzhao 的回复:
PER_IO_CONTEXT应该在工作者线程的什么位置释放?
GetQueuedCompletionStatus返回就意味着投递完成了, 根据业务要求把数据处理后,就可以释放了
yangyanzhao 2017-07-26
  • 打赏
  • 举报
回复
PER_IO_CONTEXT应该在工作者线程的什么位置释放?
worldy 2017-07-25
  • 打赏
  • 举报
回复
引用 4 楼 yangyanzhao 的回复:
我不知道完成端口中_PER_IO_CONTEXT应该在哪里释放,我试过在Worker线程返回通知后释放,但会出1236号错误,可能主机还在使用,释放掉的话主机积极关闭连接了。
引用 4 楼 yangyanzhao 的回复:
我不知道完成端口中_PER_IO_CONTEXT应该在哪里释放,我试过在Worker线程返回通知后释放,但会出1236号错误,可能主机还在使用,释放掉的话主机积极关闭连接了。
IOCP的线程,原则上是一直运行,不会退出的,一般_PER_IO_CONTEXT是在每个IO返回后就要释放,但是Overlap数据是可以回收重用的
xian_wwq 2017-07-24
  • 打赏
  • 举报
回复
如果投递完成后的对象都正常释放了 申请内存不足有可能是内存碎片太多 可以考虑使用内存池 可以提高效率 避免内存碎片
worldy 2017-07-24
  • 打赏
  • 举报
回复
_PER_IO_CONTEXT一直申请,你不在使用的是时候要删除
sevancheng 2017-07-24
  • 打赏
  • 举报
回复
没有进行内存释放吧,用完要回收,或者用智能指针试试
Lytton_jing 2017-07-24
  • 打赏
  • 举报
回复
学习学习 http://blog.csdn.net/ddjj_1980/article/details/74940593
yangyanzhao 2017-07-24
  • 打赏
  • 举报
回复
我不知道完成端口中_PER_IO_CONTEXT应该在哪里释放,我试过在Worker线程返回通知后释放,但会出1236号错误,可能主机还在使用,释放掉的话主机积极关闭连接了。

18,356

社区成员

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

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