一个完成端口写的服务器,当客户端不停的连接服务器 然后断开 这样重复大概几个小时后 CreateIoCompletionPort函数调用失败 请大家分析一下是什么原因
解决方案 »
- 服务端如何在OnAccept()外send信息给客户端?
- serialize的问题
- 谁有使用Mutex源代码,我的线程不能互斥
- 如何使tree的某个叶子或结点DisEnable=================
- 键盘响应被隐藏了怎么办?
- 用CHtmlView类时,怎样才能屏蔽其本身的右键菜单及加入自己的菜单呢?在其内选择文本(其他)时会触发什么事件?
- 一个简单的关于LoadBitmap的问题,可我不成功
- 关于再线程理调用其他类的成员函数
- 怎样调试cpl程序?
- "请稍后..."的提示框如何实现?
- 急问位图文件如何显示(Win32 Application),请指点!!!!!!!!!!!!!!!
- MSDN
如果你是用AcceptEx的话建议你改成WSAAccept,因为AcceptEx如果Client没有发数据过来会停在那!WSAAccept是同步的,要用一个线程来不停那循环!
相信大家都看到过
unsigned CIOCPServer::ListenThreadProc(LPVOID lParam)
{
CIOCPServer* pThis = reinterpret_cast<CIOCPServer*>(lParam); WSANETWORKEVENTS events;
memset( &events,0,sizeof(WSANETWORKEVENTS) );
while(1)
{ if (WaitForSingleObject(pThis->m_hKillEvent, 10) == WAIT_OBJECT_0)
break;
DWORD dwRet;
dwRet = WSAWaitForMultipleEvents(1,
&pThis->m_hEvent,
FALSE,
150,//100
FALSE); if (dwRet == WSA_WAIT_TIMEOUT)
continue; int nRet = WSAEnumNetworkEvents(pThis->m_socListen,
pThis->m_hEvent,
&events);
if (nRet == SOCKET_ERROR)
{
//TRACE(_T("WSAEnumNetworkEvents error %ld\n"),WSAGetLastError());
CString str;
str.Format("WSAEnumNetworkEvents error %ld",WSAGetLastError());
pThis->m_pServerIOMgr->m_LogFile.MsgOut(str); break;
} if (events.lNetworkEvents & FD_ACCEPT)
{
if (events.iErrorCode[FD_ACCEPT_BIT] == 0)
{
pThis->OnAccept();
}
else
{
//TRACE(_T("Unknown network event error %ld\n"),WSAGetLastError());
CString str;
str.Format("Unknown network event error %ld",WSAGetLastError());
pThis->m_pServerIOMgr->m_LogFile.MsgOut(str); break; } }
} return 0;
}void CIOCPServer::OnAccept()
{
SOCKADDR_IN SockAddr;
SOCKET clientSocket;
int nRet;
int nLen; nLen = sizeof(SOCKADDR_IN);
clientSocket = accept(m_socListen,
(LPSOCKADDR)&SockAddr,
&nLen); if (clientSocket == SOCKET_ERROR)
{
nRet = WSAGetLastError();
if (nRet != WSAEWOULDBLOCK)
{
//TRACE(_T("accept() error\n"),WSAGetLastError());
CString str;
str.Format("accept() error %ld",nRet);
m_pServerIOMgr->m_LogFile.MsgOut(str); return;
}
}
ClientContext* pContext = AllocateContext();//控制台死掉的话 被分配的ClientContext不能被清除 直到TCP机制检测到和控制台连接断开(???) pContext->m_Socket = clientSocket;
pContext->m_wsaInBuffer.buf = (char*)pContext->m_byInBuffer;
pContext->m_wsaInBuffer.len = sizeof(pContext->m_byInBuffer);
/*
const char chOpt = 1;
int nErr = setsockopt(pContext->m_Socket, IPPROTO_TCP, TCP_NODELAY, &chOpt, sizeof(char));
if (nErr == -1)
{
TRACE(_T("setsockopt() error\n"),WSAGetLastError());
return;
}
*/ int nZero = 16*1024;
setsockopt(pContext->m_Socket,SOL_SOCKET,SO_RCVBUF,(char *)&nZero,sizeof(nZero) ); //为新的套接字分配完成端口
if ( !AssociateSocketWithCompletionPort(clientSocket, m_hCompletionPort, (DWORD) pContext) )//这个地方ssociateSocketWithCompletionPort 返回FALSE 然后客户端连接出现10061错误
{
delete pContext;
pContext = NULL; closesocket( clientSocket );
closesocket( m_socListen );
CString str;
str.Format("AssociateSocketWithCompletionPort Error %ld",::GetLastError());
m_pServerIOMgr->m_LogFile.MsgOut(str);
return;
}
g_ContextListCriticalSection.Lock();
m_ContextList.AddTail(pContext);
g_ContextListCriticalSection.Unlock();
DWORD RecvBytes;
DWORD Flags;
Flags = 0;
if (WSARecv(clientSocket, &(pContext->m_wsaInBuffer), 1, &RecvBytes, &Flags,
&(pContext->Overlapped), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
return;
}
}}BOOL CIOCPServer::AssociateSocketWithCompletionPort(SOCKET socket, HANDLE hCompletionPort, DWORD dwCompletionKey)
{
HANDLE h = CreateIoCompletionPort((HANDLE) socket, hCompletionPort, dwCompletionKey, 0);
return h == hCompletionPort;//我怀疑是这句错了
}
“这个地方AssociateSocketWithCompletionPort 返回FALSE 然后客户端连接出现10061错误
”
----------------
是的 已经调用closesocket了
{
if(CreateIoCompletionPort((HANDLE) socket, hCompletionPort, dwCompletionKey, 0) == NULL)
{
DWORD dwErr = GetLastError();
return FALSE;
} return TRUE;
} 具体看一下dwErr,然后看下传入的参数是否有效
}
或者给个网址!
[email protected],这个也是我的msn,希望以后能联系!