C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[50401] [질문]Re:Re:TList에 Error....
고구마 [] 1324 읽음    2007-08-28 20:08
예 맞습니다  m_pInfoListLock 은 TCriticalSection 이구요
일단 1초로 줬을때는 밑에와 같은 현상이 발생 안하구요
에러 내용은 TList 에서 클라이언트 소켓 에러시 클라이언트를 제거하는데
IOCP 큐에 등록된것이 실행이 되서 나오는 에러같은데요
암튼 시간을 짧게 잡으면 쓰고 읽기가 굉장히 불안해 지네요
혹 시간을 짧게 잡았을때 읽고 쓰기를 안정적으로 가지고 갈수 있는 팁 같은거는 없나요 ^^;
있으면 부탁좀 드립니다

장성호 님이 쓰신 글 :
: 음....
:
: m_pInfoListLock ==> 이놈이 뭔가요?
: 혹시 TCriticalSection 인지요?
:
: Lock을 걸로 풀기전에 관련 객체에 접근하면서 발생한 문제 같습니다.
:
: 서버테스트를 위해 interval을 50ms주신것이라 했는데...
: 네트워크 상황에 따라  데이타 전송하는데 걸리는 시간은 천차만별이겠죠
:
: 결론적으로 TList에러가 아니라 로직문제인것 같습니다.
:
: 그럼....
:
:
: 고구마 님이 쓰신 글 :
: : 안녕하세요 고수님들 도움을 요청합니다
: : 다름이 아니라 서버를 개발하고 있는데 클라이언트 관리를 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 큐에 등록해서 사용합니다 원하신다면 풀소스를 드리겠습니다
: : 해결방법이나 혹은 비슷한 경험담이라도 좋으니 답변해주시면 감사하겠습니다

+ -

관련 글 리스트
50397 TList에 Error.... 고구마 1248 2007/08/28
50398     Re:TList에 Error.... 장성호 1115 2007/08/28
50401         [질문]Re:Re:TList에 Error.... 고구마 1324 2007/08/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.