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
[66697] Re:Indy 소켓 버그(InputBufferIsEmpty)
박우성 [solgari] 4495 읽음    2012-03-20 11:42
IOHandler의 InputBuffer는 단순한 캐쉬로, 읽기 관련 함수가 호출될 때에만, 버퍼에 자료가 쌓이게 됩니다.

즉, 데이타를 Write하고나서, 바로 InputBuffer를 검사해 보면 항상 0입니다. 왜나면 Data를 받으라는 명령어가 있어야만 버퍼에 쌓이게 되는 것이기 때문에 그 전까지는 버퍼에 데이타가 없는 거죠.

그러면, 데이타를 받을 때까지 기다리려면 어떻게 해야 할까요? CheckForDataOnSource나 Readble 같은 함수를 이용하여 데이타가 들어올 때까지 기다리면 됩니다.

CheckForDataOnSource를 사용한 다음 샘플 코드를 참고하시기 바랍니다.

	try{
		IdTCPClient1->Host = "www.google.com";
		IdTCPClient1->Port = 80;
		IdTCPClient1->Connect();
		IdTCPClient1->IOHandler->Write( "GET / HTTP/1.0\r\n\r\n", TEncoding::ASCII );

		IdTCPClient1->IOHandler->CheckForDataOnSource(10000);

		int nSize = IdTCPClient1->IOHandler->InputBuffer->Size;

		Memo1->Lines->Add( IdTCPClient1->IOHandler->ReadString( nSize, TEncoding::ASCII ) );
	}__finally{
		IdTCPClient1->Disconnect();
	} 


참고로, CheckForDataSource의 파라메터 10000은 1000MiliSeconds로 10초를 나타냅니다. 무조건 10초를 기다리는 것이 아니라, 데이타를 들어오지 않을 경우에 최고 10초를 기다리는 것입니다. 1바이트라도 데이타가 들어오는 즉시 Return되는 것이니까, 적당한 타임아웃 시간을 주어 그 시간에 데이타를 못 받으면, 예외처리하면 됩니다.


비베시러 님이 쓰신 글 :
: 안녕하세요.
:
: Indy 10.5.5를 쓰고 있습니다( BDS 2010에 포함된)
: TCP Client 모듈을 사용하고 수신시에 함수가 동작을 안하는 문제가 있네요.
:
: 명령을 송신후에  하기 두 함수가 이상 동작을 합니다.
:
:
: Client->IOHandler->InputBufferIsEmpty()   --- 항상 empty로 읽힌다.
: int InSize = Client->IOHandler->InputBuffer->Size;   ---- 항상 0으로 읽힌다.
:
: read string으로 읽어보면
: 문자가 들어옵니다.
:
: UnicodeString Message = Client->IOHandler->ReadString(2); // read text
: print(Message);
:
: 왜그런지 아시는 분 도움 부탁드립니다.
: 해외에서 프로그램 작업 중인데 아주 괴롭네요.
:
: 1.  버전 문제인지? 인디 버전을  상위 버전을 사용하면 해결이 되는것인지..?
: 2. 사용 방법 상의 문제인지..?
:
: 알려주세요.

+ -

관련 글 리스트
66663 Indy 소켓 버그(InputBufferIsEmpty) 비베시러 1604 2012/03/16
66697     Re:Indy 소켓 버그(InputBufferIsEmpty) 박우성 4495 2012/03/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.