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
[69982] Re:Re:TIdTCPClient 와 TpsmTminTCPServer 의 통신 문제
병관 [flashkiller] 2483 읽음    2013-08-13 09:24
memi 님 답변 감사합니다.

현재는 InputBufferIsEmpty() 요녀석이 펄스가 안 된다는 것입니다.

그렇다면 버퍼에 데이터가 없다는 상태라는 말이고,
버퍼에 데이터가 없는건
서버로부터 데이터를 받지 못했거나
서버가 전달을 제대로 못해주고 있거나
둘 중 하나라는 얘기인데,

TpsmTminTCPClient 로 만든 클라이언트에서는 잘 받아오지만
TIdTCPClient 에는 왜 버퍼에 데이터가 안 쌓이는 건지 알 수가 없네요.

버퍼에 쌓이게 하려면 뭔가 특수 문자를 보내줘야 한다거나,
스트링 방식을 다른 형태로 써줘야 된다거나...

참고로 환경은 XP 에 빌더는 2007 버전 사용 중입니다.



memi 님이 쓰신 글 :
: IdTCPClient->IOHandler->InputBufferIsEmpty() -> 비어있으면 트루
: IdTCPClient->IOHandler->InputBuffer->Size -> 바이트단위
:
: ex)
: if(!IdTCPClient->IOHandler->InputBufferIsEmpty()) {
:   for(int i = 0; i < IdTCPClient->IOHandler->InputBuffer->Size; i++) {
:     IdTCPClient->IOHandler->InputBuffer->ReadByte();
:     // 바이트단위로 처리
:   }
:
: }
:
: 병관 님이 쓰신 글 :
: : TpsmTminTCPServer 클래스를 사용해서 서버를 실행시키고 포트를 오픈했습니다.
: :
: : TIdTCPClient 클래스를 사용해서 클라이언트를 실행시켰습니다.
: :
: : 클라이언트에서 Connect 를 수행하여 서버에 접속했습니다.
: :
: : 서버는 연결되었다는 이벤트를 잘 받고 소켓을 저장하여 지가 할 일을 잘 수행했습니다.
: :
: : 클라이언트에서 Write 를 하여 서버로 데이터를 전송했습니다.
: :
: : 서버는 데이터 이벤트를 받고 잘 처리 했습니다.
: :
: : 서버가 클라이언트에게 필요한 데이터를 전송했습니다.
: :
: : 클라이언트는 못 받습니다. 도대체 왜 못 받는지 모르겠습니다. ㅠㅠ
: :
: : TIdTCPClient 와 TpsmTminTCPServer 는 서로 통신을 할 수 없는 건가요?
: :
: : 고수분들의 조언을 기다리겠습니다.
: :
: :
: : P.S
: :
: : 모르는 부분을 정리하자면,
: :
: : IdTCPClient->IOHandler->InputBufferIsEmpty()
: : 요녀석...
: : 인풋된 버퍼가 비어있으면 트루를 돌려주는 건지, 펄스를 돌려주는 건지 모르겠습니다. '비어있으면 트루'로 알고 있습니다.
: : : : IdTCPClient->IOHandler->InputBuffer->Size
: : 요녀석...
: : Size 를 따라가보니 int 형인건 알겠는데, 바이트 단위의 사이즈를 말하는 건지, 어떤 사이즈를 말하는 건지 잘 모르겠습니다.
: : : : : : : : : : 참고로 서버측 소스는 아래와 같이 구현되어 있습니다. : : : :
: : // 서버측 소스
: : __fastcall 그래그래응응::그래그래응응(널)
: : {
: : 	TCPServer = new TpsmTminTCPServer(NULL);
: : 	TCPServer->OnAccept	= OnConnect; // 클라이언트가 연결 되었을 때 호출되는 함수
: : 	TCPServer->OnClose 	= ServerClose; // Client 가 Close(Disconnect) 했을때 호출되는 함수
: : 	TCPServer->OnData 	= ReceiveData; // Client 로부터 데이터가 전송되었을 때 호출되는 함수
: : 	TCPServer->OnError 	= ServerError; // Error 발생 시 호출되는 함수
: : 	TCPServer->Port 		= "포트번호"; // 설마... 제가 "포트번호"라고 입력했을 거란 생각을 하신건 아니시겠죠?
: : 	// ... 기타 등등
: : 	TCPServer->Open(); // 서버 포트 오픈
: : }
: : void __fastcall 그래그래응응::ReceiveData(TObject *불른놈, int 소켓)
: : {
: : 	String 메쎄지 = "";
: : 	메쎄지 = TCPServer->Read(소켓);
: : 	출력해(메쎄지); // 잘 됩니다.
: : }
: : void __fastcall 그래그래응응::전송(int 소켓, String 메쎄지)
: : {
: : 	TCPServer->Write(소켓, 메쎄지); // 여기선 보냈습니다.
: : }
: : 
: : : : 아래는 클라이언트 소스입니다. : : : :
: : // 클라이언트측 소스
: : void __fastcall TForm1::RecvTimerTimer(TObject *Sender) // 테스트라서 타이머 돌려서 받아오도록 했습니다.
: : {
: : 	int bufSize = 0;
: : 	int i = 0;
: : 	String recvMsg = "";
: : 
: : 	if( IdTCPClient->Connected() ) // 연결되었는가 보고
: : 	{
: : 		if( IdTCPClient->IOHandler->InputBufferIsEmpty() == false ) // 버퍼에 데타가 있으면
: : 		{
: : 			bufSize = IdTCPClient->IOHandler->InputBuffer->Size; // 싸이즈만큼
: : 			recvMsg = IdTCPClient->IOHandler->ReadString(bufSize); // 가져와서 스트링 변수에 여코
: : 			if( recvMsg != "" ) Memo1->Lines->Add(recvMsg); // 데이터 있으면 메모에 출력해
: : 		}
: : 	}
: : }
: : //---------------------------------------------------------------------------
: : 
: : : :

+ -

관련 글 리스트
69980 TIdTCPClient 와 TpsmTminTCPServer 의 통신 문제 병관 3485 2013/08/12
69981     Re:TIdTCPClient 와 TpsmTminTCPServer 의 통신 문제 memi 3004 2013/08/13
69982         Re:Re:TIdTCPClient 와 TpsmTminTCPServer 의 통신 문제 병관 2483 2013/08/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.