아마도 패킷이 순간적으로 몰리거나 할때 지정된 내부버퍼를 초과하면 메모리 누수가 생기는것 같가요..
TMemoryStream 사이즈가 비정상적인 값으로 들어갑니다. 무한값으로..ㅡ.ㅡ
예전에 1000커넥션으로 10초마다 수십바이트짜리 패킷을 모든 클라이언트에 뿌리는 방법으로 테스트했을 때는 문제가 없었거든요.. 그땐 초당 8메가였었는데..
초당 10여회 이상으로 수천바이트씩 막 뿌려대면 뭔가 답이 없는 듯..ㅡ.ㅡ
roEhd 님이 쓰신 글 :
: 원인은 스레딩과 관련이 있는것 같긴한데
: 우선 서버에서
:
: /*
: lpList = TCPServer->Contexts->LockList();
:
: for(int i = 0; i < lpList->Count; i++)
: {
: TIdContext *lpContext = (TIdContext *)lpList->Items[i];
:
: SendStream->Position = 0;
: lpContext->Connection->IOHandler->Write(SendStream, 0, true);
:
: // 보내는 속도 측정
: SendSize += (HEADER_SIZE + Size);
: }
:
: TCPServer->Contexts->UnlockList();
: */
:
: SendStream->Position = 0;
: AContext->Connection->IOHandler->Write(SendStream, 0, true);
: // 보내는 속도 측정
: SendSize += (HEADER_SIZE + Size);
:
: 요렇게 해보면 모든 클라에게 데이타를 보내는 구조는 아니지만 상당히 안정적으로 바뀝던데
: 99개의 클라를 10ms 타이머로 해도 좀처럼 문제가 안생기던데 (딱한번 생김)
: 딱히 원인을 모르겠어요, 인디 싫어졌음,. ㅜ,ㅜ
:
: 용맨소녀 님이 쓰신 글 :
: : 쓰레드 안에서 패킷을 받는게 문제인가요? 커넥션마다 독립적인데요.. 인디 예제같은거 봐도 쓰레드 안에서 받고 그러지 않나요?
: :
: : roEhd 님이 쓰신 글 :
: : : 클라 소스도 보세요
: : :
: : : Lyn 님이 쓰신 글 :
: : : : Read 는 어차피 한 Thread에서밖에 호출 안하고 Write 는 LockList로 묶여있기 때문에 상관 없습니다.
: : : : printf야 애초에 safe던 아니던 알바아니고 ...
: : : :
: : : : roEhd 님이 쓰신 글 :
: : : : : 내 생각엔 스레드 문제 같습니다.
: : : : : Context->IOHandler->ReadStream(RecvStream);
: : : : : Context->IOHandler->Write(SendStream, 0, true);
: : : : : 같은 함수는 Thread-Safe 가 아닐 겁니다.
: : : : : 심지어 printf 조차 Thread-Safe 가 아닌걸로 압니다.
: : : : :
: : : : : 용맨소녀 님이 쓰신 글 :
: : : : : : 단순화해서 한 번 만들었는데요..
: : : : : :
: : : : : : 한 번씩 패킷이 깨져서 오는 경우가 있어요..
: : : : : :
: : : : : : 서버에서 클라로 보내는 속도는 초당 17메가고 클라에서 서버로 보내는 속도는 초당 500KB 정도 됩니다..
: : : : : :
: : : : : : 70ms마다 30명이 패킷을 날리면 서버는 그걸 모든 클라이언트에게 되돌려줍니다..
: : : : : :
: : : : : : 그냥 컴터 하나에 서버, 클라 둘 다 실행하면 됩니다..
: : : : : :
: : : : : :
: : : : : :
: : : : : : 덧붙임 : Stream으로 처리해서 그런지 처리 속도가 늦어서 그런 감도 있는 것 같네요.. 다른 방법으로도 테스트 해봐야겠네요..