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
[67136] Re:Re:TIdTCPServer Component 질문입니다...
chrisb [bjslv] 3791 읽음    2012-05-05 00:15
감사합니다. ^^

서버 쪽은 일러주신 방법으로 어느 정도 문제점이 잡힌 것 같습니다.

그런데 클라이언트 쪽에서.. 서버가 죽었다는 것을 알 수 있는 방법은 없을까요?

처음에 접속을 할 때도 중간에 끊어졌을 때도 서버가 닫혀있다는 것을 알면 좋겠는데..

현재는 위 두 상황을 만들어내면 클라이언트 쪽에서 IdTCPClient1->Connect() 부분에서 에러를 띄우게 됩니다.

try/catch의 catch부분에 걸리지 않아서(try에 있는 IdTCPClient1->Connect()에서 이미 에러가 떠버림)
예외처리도 못하겠고... 이 부분은 어떻게 처리 할 수 있을까요...?

il's 님이 쓰신 글 :
:
: void __fastcall TFormzMain::ClientSocketDataReceived()
: {
:       TIdBytes       SocketReceiveArray;
:       unsigned char  ReceiveDataBuffer[1024];
: 
:       try
:       {
:             IdTCPClient->IOHandler->CheckForDisconnect(true, true);
:             IdTCPClient->IOHandler->CheckForDataOnSource(100);
:             IdTCPClient->CheckForGracefulDisconnect(true);
: 
:             SocketReceiveSize = IdTCPClient->IOHandler->InputBuffer->Size;
:       }
:       catch(...)
:       {
:             return;
:       }
: 
:       if (SocketReceiveSize != 0)
:       {
:             try
:             {
:                   IdTCPClient->IOHandler->ReadBytes(SocketReceiveArray, SocketReceiveSize, false);
: 
:                   BytesToRaw(SocketReceiveArray, &ReceiveDataBuffer, SocketReceiveSize);
:             }
:             catch(...)
:             {			
:                   return;
:             }
:       }
:  }
: 
: 

:
:
: void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
: {
:     	int RecieveSize;
: 	unsigned char  ReceiveDataBuffer[1024];
: 
: 	
: 	try
: 	{
: 		AContext->Connection->IOHandler->CheckForDisconnect(true, true);
: 		AContext->Connection->CheckForGracefulDisconnect(true);
: 
: 		RecieveSize = AContext->Connection->IOHandler->InputBuffer->Size;
: 	}
: 	catch(...)
: 	{
: 		return;
: 	}
: 	
: 	
: 	if (RecieveSize >= 1)
: 	{
: 		try
: 		{
: 			AContext->Connection->IOHandler->ReadBytes(SocketReceiveArray, RecieveSize, false);
: 		}
: 		catch (EIdConnClosedGracefully &E)
: 		{
: 			AContext->Connection->IOHandler->InputBuffer->Clear();
: 			AContext->Connection->Disconnect();
: 			return;
: 		}
: 		
: 		BytesToRaw(SocketReceiveArray, ReceiveDataBuffer, RecieveSize);
: 	}
: 	}
: 

:
: chrisb 님이 쓰신 글 :
: : Server와 Client 프로그램을 짜서 값을 주고 받는 프로그램을 짜고 있습니다.
: :
: : 값을 주고 받는 건 잘 되고 있습니다만..
: :
: : 문제가 조금 있습니다.
: :
: : 1. 서버가 갑자기 죽거나 정전 등의 경우가 발생했을 경우에 Client쪽에서 접속을 종료하게 하고 싶은 것이 한 가지이고,
: :
: : 2.현재 서버를 돌려놓고 클라이언트에서 IdClient->Connect()만 하면 Server 쪽에 값을 읽는 부분에서 멈춰서 다음으로 넘어가지도 않고 그 자리에서 대기만 하고 있는 것 같습니다.
: :
: : 이로 인해서 발생하는 문제는 프로그램이 그냥 꺼지지 않고 에러를 보내거나 작업관리자에 프로세스가 여전히 남아있거나 하는등의 문제입니다..
: :
: : 왜 저 부분에서 계속해서 멈춰있는지 모르겠습니다...
: :
: : 1번의 경우는 서버쪽에서 뭔가를 보내줄 수가 없는 상황인 것 같아서 클라이언트 쪽에서 뭔가를 해야 할 것 같은데..
: : 다른 방법이 있을런지요...?
: :
: : 2번의 경우는 전혀 감이 잡히지 않습니다.
: :
: : 2번 관련 서버 쪽 소스코드를 올리겠습니다.
: :
: :
 
: : void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
: : {
: : TIdBytes tStr;
: : 
: : try
: : {
: : 	if(AContext->Connection->Connected())
: : 	{       
: : 		try
: : 		{ 
: : 			tStr.set_length(sizeof(FROMCLIENT));
: : 			int s = sizeof(FROMCLIENT);
: : 
: : 			memset(&FROMCLIENT,0,sizeof(FROMCLIENT));
: : 			AContext->Connection->IOHandler->ReadBytes(tStr,s,false);//이 부분에 대기중
: : 
: : 			BytesToRaw(tStr,&FROMCLIENT,s);
: : 		}
: : 		catch(...)
: : 		{
: : 			ListBox1->Items->Insert(0, "Error");
: : 			Shape1->Brush->Color = clRed;
: : 		}
: : 	}
: : }
: : 	

+ -

관련 글 리스트
67102 TIdTCPServer Component 질문입니다... chrisb 1307 2012/05/03
67103     Re:TIdTCPServer Component 질문입니다... il's 3548 2012/05/03
67136         Re:Re:TIdTCPServer Component 질문입니다... chrisb 3791 2012/05/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.