|
안녕하세요 고수님들 도움을 요청합니다
다름이 아니라 서버를 개발하고 있는데 클라이언트 관리를 TList로 합니다
지금 현재는 테스트 중인데 타이머 인터발을 50으로 주고 모든 클라이언트에 데이터를 보냅니다
그리고 클라이언트는 접속 되자 마자 그 데이터를 받게 되고 데이터를 받은 클라이언트는
다시 서버로 결과값을 넘깁니다
단순히 서버의 테스트를 위해서 인터벌을 50으로 준건데 문제는
보내는 클라이언트를 하나 추가할때 밑에 이런 메시지가 뜹니다
에러내용
Classes 파일에
raise EListError.CreateFmt(Msg, [Data]) at ReturnAddr;
인터발을 500으로 주게 되면 클라이언트 40 커넥션정도에서 발생하고 50으로 주게 되면 2커넥션에서
발생합니다
클라이언트가 연결되자마자 리스트에 추가하고 바로 데이터를 보내게 되는데 시간적 여유가 없어서
메모리가 엉킨건지는 모르겠지만 상용 서버라면 이정도 테스트를 무난히 패스할수 있어야 한다고 생각하는데요
잘 안되네요
아 그리고 IOCP입니다
소스는 간단히
m_pInfoListLock->Enter();
INT32 nClientMax = m_pClientInfoList->Count;
for(INT32 i=0; i<nClientMax; i++)
{
if((ClientInfo*)m_pClientInfoList->Items[i])
{
SendData((ClientInfo*)m_pClientInfoList->Items[0], pData, nDataLen);
}
else
{
ShowMsgBox("CIOCPSWin::SendDataAll : ppClientInfoList","ERROR_MEMORY_NULL");
m_pInfoListLock->Leave();
return ERROR_MEMORY_NULL;
}
}
m_pInfoListLock->Leave();
이렇게 되고요
SendData 에서는
bool bSuccess = PostQueuedCompletionStatus(m_hCompletionPort,
pOverlapBuff->GetSendBufferCnt(),
(DWORD) pClientInfo, &pOverlapBuff->m_overLapp);
이렇게 해서 IOCP 큐에 등록해서 사용합니다 원하신다면 풀소스를 드리겠습니다
해결방법이나 혹은 비슷한 경험담이라도 좋으니 답변해주시면 감사하겠습니다
|