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
[40844] Re:Re:Re:Re:Re:[질문] Indy TCPServer 쓰레드에서요..
황경록 [mpbox] 1320 읽음    2005-07-01 11:53
음;; 우선 클라이언트에서 서버로 데이터를 보낼때 데이터 앞에 데이터의 길이를 붙여 보내주세요.
그럼 이렇게 되죠.

클라이언트 -> 2바이트(길이=36) + 36바이트(데이터) = 38 바이트 전송
서버 -> OnExecute 발생시 2 바이트를 먼저 읽어 이후 데이터의길이를 확인 후 데이터 길이 만큼 readBuffer
뭐.. 이런식이죠.

그리고 스택사이즈를 검사하는 건 ReadBuffer 로 무조건 걸어놓으면 중간에 종료시킬때 블럭킹 된 부분이
문제가 되기 때문에 그렇게 하는 것이죠 ^^...

지금은 외부로 나가야해서 월요일이나 ^^... 그럼 수고하세요.


글재주가 없어서요 ^^::

★래미★ 님이 쓰신 글 :
: 정말 정말 감사합니다...
: 황경록님 도움에 힘입어 OnExecute를 다음과 같이 작성했고 그닥 문제는 없는걸로 보입니다...
: 그렇게까지 해주셨는데도.. 지금까지 이거 작성하고 있었지 모예요 ㅠㅠ
: 우선 이대로 괜찮은가.. 한번 훑어봐 주시구요~(불안.. 초조.. 기대..)
:
: 그럼에도 불구하고 이해가 안가는 부분이..do..while을 쓰면서
: iStackBufSize = con->InputBuffer->Size; 요게 계속 줄어드나요??
: do..while을 써야하는 이유를 모르겠어요..
: 제가 요 아래대로 해서 테스트 해본 결과로는 데이터가 있을때는
: iExpectedLen랑 iStackBufSize 요게 같은 값으로 나오더라구요..
: 다시 한번 친절한 설명을 부탁드립니다. __) 너무 염치가 없어서 죄송^^;
:
:
: void __fastcall TForm1::TCPServerExecute(TIdPeerThread *AThread)
: {
:     if( AThread->Stopped || AThread->Terminated ) return;
:     TIdTCPServerConnection * con = AThread->Connection;
:     char Message[BUF_SIZE]={0,};
:     int iExpectedLen=0, iStackBufSize=0;
:
:     try
:     {
:         Application->ProcessMessages();
:         do
:         {
:             iExpectedLen = con->ReadFromStack( true, 1000, false );
:             iStackBufSize = con->InputBuffer->Size;
:
:             if(AThread->Terminated)
:             {
:                 throw Exception( "Termination Detected!" );
:             }
:
:         } while( iStackBufSize < iExpectedLen ); // expected packet size
:
:         if(iExpectedLen > 0){
:             con->ReadBuffer(Message, iExpectedLen);
:             MessageHandler(Message, AThread);
:         }
:     }
:
:     catch(const Exception &e)
:     {
:         RichEdit1->Lines->Add("Error...");
:         con->Disconnect();
:     }
: }
:
:
:
: 황경록 님이 쓰신 글 :
: : ^^:: 음.. 우선 네트워크 프로그램을 설계할 때 클라이언트 입장으로 시작한다면 개념이
: : 단순해 질수 있습니다.
: : 즉, 클라이언트가 요청하면 서버가 준다 뭐 이런식이죠.
: :
: : 클라이언트에서 스택을 검사해서 원하는 양의 패킷을 받는 예 입니다.(쓰레드 안에서 사용하셔야 합니다.)
: :
: : int TZTCPConn::readExpectedSize( TIdTCPClient* pReader, TByteArray& bufRead, int iExpectedLen )
: : {
: :     ZeroMemory( bufRead, sizeof(bufRead) );
: :
: :     int iStackBufSize = 0;
: :
: :     try
: :     {
: :         do
: :         {
: :             pReader->ReadFromStack( true, 1000, false );
: :             iStackBufSize = pReader->InputBuffer->Size;
: :
: :             #ifdef APP_DEBUG
: :             zout.trace("Thread[%d]: CMD-RES_INIT_INFO Check Stack Size : %d\n", ThreadID, iStackBufSize);
: :             #endif
: :
: :             if( Terminated() )
: :             {
: :                 throw Exception( "Termination Detected!" );
: :             }
: :
: :         } while( iStackBufSize < iExpectedLen ); // expected packet size
: :
: :         pReader->ReadBuffer( bufRead, iExpectedLen );
: :     }
: :     catch( const Exception &e )
: :     {
: :         return 0;
: :     }
: :
: :     return iExpectedLen;
: : }
: :
: : ★래미★ 님이 쓰신 글 :
: : : 답변 감사드립니다... __)*
: : : 문제가 있다는 것은 알겠으나, 해결책에 대해서는 도통 까막눈이네요 ㅠㅠ
: : : 우선 GStack 이라는 것을 어떻게 써야될지 모르겠어요...
: : : 세심한 답변에도 불구하고 죄송 ^^;(모르는게 죄라서요 ㅠㅠ)
: : : 무식한 방법으로 패킷사이즈를 고정시켜 통신하는 방법을 고려해야되겠다는 생각이 드네요..
: : : 도움이 많이 되었네요^^
: : :
: : : 황경록 님이 쓰신 글 :
: : : : ReadBuffer 를 사용하시면 BufSize 만큼 읽을 때까지 블럭상태가 됩니다.
: : : : 상대가 주는 패킷사이즈를 미리 알지 못한다면 ReadBuffer 를 사용하는데 문제가 있을것으로 보이는 군요.
: : : : 이럴 땐 GStack 을 사용해서 InputBuffer 의 크기를 미리 검사하고 검사하는 루틴에 인스턴스 종료에 대한 부분도 추가하고 Timeout 을 일정한 시간을 주는 것도 효율적이라 생각됩니다만...
: : : :
: : : : ★래미★ 님이 쓰신 글 :
: : : : : 아래 함수에서 ReadLn()으로 하면 읽히는데, ReadBuffer(Message, BUF_SIZE)로 하면
: : : : : 그 부분에서 멈추어 있습니다.
: : : : : 관련 Q&A를 찾아보려 했으나, 무식한 나머지 답이 비켜가는둣 하네요 ㅠㅠ
: : : : : 서버에서 여러개의 클라이언트를 상대하여 데이터를 listen 하고
: : : : : 또 다른 데이터를 주기도 할려구요(이부분은 타이머를 이용할려고 생각중입니다. 아직 미 구현..)
: : : : : 한데 클라이언트로부터 받을 데이터가 크기가 부정확한 binary(내부 프로토콜을 구성할 예정이구요)로 되어있어
: : : : : 이를 어떻게 받아들여야될지 모르겠네요 ㅠㅠ
: : : : : 서버랑 클라이언트 소스 첨부했습니다.
: : : : : 이 외에도 지적할 부분이 있으시면 많은 도움 주세요 __)/
: : : : :
: : : : :
: : : : :
: : : : : void __fastcall TForm1::TCPServerExecute(TIdPeerThread *AThread)
: : : : : {
: : : : : /*
: : : : :     if( AThread->Stopped || AThread->Terminated ) return;
: : : : :     TIdTCPServerConnection * con = AThread->Connection;
: : : : :     AnsiString Message;
: : : : :     try {
: : : : :         Application->ProcessMessages();
: : : : :         Message = con->ReadLn();
: : : : :         MessageHandler(Message.c_str(), AThread);
: : : : :     }
: : : : :     catch(...) {
: : : : : //        ListBox1->Items->Add("Error...");
: : : : :         con->Disconnect();
: : : : :     }
: : : : : */
: : : : :
: : : : :     if( AThread->Stopped || AThread->Terminated ) return;
: : : : :     TIdTCPServerConnection * con = AThread->Connection;
: : : : :     char Message[BUF_SIZE];
: : : : :     try
: : : : :     {
: : : : :         Application->ProcessMessages();
: : : : :         con->ReadBuffer(Message, BUF_SIZE);
: : : : : //        con->ClearWriteBuffer();
: : : : :         MessageHandler(Message, AThread);
: : : : :     }
: : : : :
: : : : :     catch(...)
: : : : :     {
: : : : : //        ListBox1->Items->Add("Error...");
: : : : :         con->Disconnect();
: : : : :     }
: : : : : }

+ -

관련 글 리스트
40826 [질문] Indy TCPServer 쓰레드에서요.. ★래미★ 1624 2005/06/30
40833     Re:[질문] Indy TCPServer 쓰레드에서요.. 황경록 2372 2005/07/01
40836         Re:Re:[질문] Indy TCPServer 쓰레드에서요.. ★래미★ 1153 2005/07/01
40837             Re:Re:Re:[질문] Indy TCPServer 쓰레드에서요.. 황경록 2594 2005/07/01
40841                 Re:Re:Re:Re:[질문] Indy TCPServer 쓰레드에서요.. ★래미★ 1825 2005/07/01
40844                     Re:Re:Re:Re:Re:[질문] Indy TCPServer 쓰레드에서요.. 황경록 1320 2005/07/01
40845                         Re:Re:Re:Re:Re:Re:[질문] Indy TCPServer 쓰레드에서요.. ★래미★ 2501 2005/07/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.