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
[67468] indyTCP 환경에서 클라이언트->서버->클라이언트 메세지전송 질문
이런젠 [cocolv] 1997 읽음    2012-06-12 09:40
안녕하세요 현재 XE2환경에서 채팅프로그램을 만들고있습니다.

주고받는 데이터형태는 구조체 인데 아래와 같습니다
typedef struct MESSAGE
{
    char Id[10];
        char Text[100];
}buff;


● 동작구현
1. 사용자가 에디트창에 문장을 입력한후 전송버튼을 누르면  구조체형태에 MESSAGE가 서버쪽으로 전송됩니다

    TMemoryStream* stream = new TMemoryStream();
    try {

        stream->WriteBuffer(&p, sizeof(buff));
        stream->Position = 0;
        IdTCPClient1->Socket->Write(stream, sizeof(buff), true);
    } catch (Exception *e) {
    	Memo1->Lines->Add(e->Message);
    }
    delete stream;


2. 서버에서 IdTCPServer1Execute 이벤트 메소드에서 데이터를 다음과같은 형태로 받아줍니다
void __fastcall TForm6::IdTCPServer1Execute( TIdContext * AContext )
{
	TMemoryStream * stream = new TMemoryStream();
	buff p;

	try
	{
		while ( AContext->Connection->Connected() )
		{
		    if ( !AContext->Connection->Socket->Readable( 1000 ) )
		   {
			continue;
		   }
		   try
		   {
			stream->Clear();
			stream->Position = 0;

                        AContext->Connection->IOHandler->ReadStream( stream );
			buff *t = (buff *)stream->Memory;
		  	stream->Position = 0;
			stream->ReadBuffer( &p, sizeof( buff ) );
	             
                        TList *List;    	   //	추후 TThreadList *List;로 변경
                        TIdContext *AContext;

                        List = IdTCPServer1->Contexts->LockList();

                         try {
	                      for ( int i = 0; i < List->Count; i++ )
	                         {
	                        	AContext = static_cast < TIdContext * > ( List->Items[ i ] );

                                        TMemoryStream* stream = new TMemoryStream();
                                        stream->WriteBuffer(&p,sizeof(p));
                                        stream->Position = 0;
                                        AContext->Connection->IOHandler->Write(stream, sizeof(p), true);
                                   }
                           } __finally {
                                        	IdTCPServer1->Contexts->UnlockList();
                           }
		   }
		   catch ( Exception * e )
		   {
			ListBox1->Items->Insert( 0, e->Message );
	           }
		}
	}
	__finally
	{
		delete stream;
	}
}


3. 여기서부터 질문인데
① 서버에서 클라이언트로 구조체 전송을했습니다. 클라이언트에서 서버로 데이터를 받을때 타이머에서 일정시간마다 데이터가 왔는지 체크하는수밖에없나요? 타이머를 부득이한경우가 아니면 안쓰는게 좋다고 들었는데요
② 구조체형태를 주고받을때 buffer형태로 데이터를 전송하는게 좋을까요?

책없이 오직 빌더포럼에만 의존해서 코딩할려니 너무 힘드네요 고수님들의 조언부탁드리겠습니다

+ -

관련 글 리스트
67468 indyTCP 환경에서 클라이언트->서버->클라이언트 메세지전송 질문 이런젠 1997 2012/06/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.