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
[75809] Re:Re:Indy TCP Server 관련 문의
김시환 [godson2] 1296 읽음    2020-03-25 16:10
아 ~~ 너무 감사합니다. 너무너무 도움이 되는 글입니다.
다시한번 감사드립니다.


정성훈.해미 님이 쓰신 글 :
: 제가 알고 있는 선(고급 지식 아님)에서
: 알려드립니다.
:
:  1. client 가 2군데 이상에서 연결이 되었을 경우 이들을 구분할 수 있나요?
:      예) master 권한과 단순 모니터링 참가자 ( 실제 제어 권한과 단순 모니터링 권한의 구분)
:   >> 답변: 녜 구분 가능합니다.
:               서버는 접속된 클라이언트 갯수와 각 클라이언트의 정보를 알 수 있습니다.
:               그리고, 제어접속과 모니터링 접속을 구분은 접속 포트로 하는 것이 쉬울 것 같네요.
:               예) 제어용 접속: 8000번 포트
:                     모니터링용 접속: 8100 포트
:                     *인디TCP서버에 8000과 8100포트를 바은드 시키고
:                       접속 클라이언트의 포트정보를 보고 제어권한을 판단하면 될 것 같습니다.
:                    코드 예)
:
: void __fastcall TForm1::TCPSExecute(TIdContext *AContext)
: {
: 	if(AContext->Connection->IOHandler->InputBufferIsEmpty())	{
: 		AContext->Connection->IOHandler->CheckForDataOnSource(1);
: 		if(AContext->Connection->IOHandler->InputBufferIsEmpty())	return;
: 	}
: 
: 	TIdBytes	ABuffer;
: 	AContext->Connection->IOHandler->ReadBytes(ABuffer, -1, false);
:     
:     // 제어 클라이언트 메시지 수신
:     if(AContext->Binding->PeerPort == 8000)  {
:         //.....
:     }
:     // 모니터링 클라이언트 메시지 수신
:     else  {
:         //.....
:     }
: }
: 

:
:
:   2. IndyTCPServer 를 잠시 테스트 했을 때 보니 보통 client에서 메시지를 보내면 그 메시지를 받고 OnExecute 에서 이벤트 처리로 응답을 보내게 되어 있던데 Client 에서 메시지를 받지 않는 상황에서 시스템 자체에서 현재 연결되어 있는  Client 들에게 특정 메시지를 보낼 수 있는지요?
:   >> 답변: 인디TCP서버는 쓰레드기반입니다.
:                OnExecute이벤트는 계속 실행되고 있는 쓰레드 함수라고 보시면 됩니다.
:                메시지를 받을 때 OnExecute에서 처리하시고
:                보낼때는 TCP서버의 Send함수를 직접 이용하십시오.
:
:               보통 대부분의 통신 콤포넌트들이 그렇듯
:               수신처리는 이벤트에서하고
:               송신처리는 직접 송신 함수를 이용합니다.
:
:               당연히 특정 클라이언트에게 메시지를 보낼 수 있습니다.
:               1)번의 답변에서 말했듯이
:                  서버는 접속된 클라이언트들의 정보를 알 수 있기때문입니다.
:                 코드 예)
:
: void TCPSend(Idglobal::TIdBytes ABuffer)
: {
:     if(TCPS->Active)    {
:         TList* ClientsList = TCPS->Contexts->LockList();
: 
:         for(int i=0; iCount; i++)    {
:             TIdContext*	pClient = (TIdContext*)ClientsList->Items[i];
:             if(pClient->Connection->Connected())    {
:                 try {
:                     pClient->Connection->IOHandler->Write(ABuffer);
:                 } catch (...) {
:                 }
:             }
:         }
:         TCPS->Contexts->UnlockList();
:     }
: }
: 

:
:

:  3. (2) 번 문항과 같은 의미 일수 있는데 서버는 클라이언트의 요청에 의해서만 응답을 하는 것인가요?
:   >> 답변: 아닙니다.
:                언제든 원하실 때 아무때나 필요한 메시지를 보내면 됩니다.

:  4. OnExecute 이벤트에서 어떤 클라이언트의 요청에 응답을 하게 되면 해당 요청을 한 특정 클라이언트에게만 응답이 가는가요?
:     아니면 연결된 모든 클라이언트에게 다 응답이 가는가요?
:   >> 답변: 녜 가능합니다.
:               일반적으로,
:               서버에 접속된 클라이언트 갯수만큼 for문을 돌면서
:               각 클라이언트에게 메시지를 보내게 코딩합니다.
:
:  5. 서버가 클라이언트의 메시지에 응답을 하는동안 현재 진행중인 제어에 부담이 되지는 않는지요??  
:      IndyTCPServer 가 자체적으로 쓰레드를 이용한다고 하는 것 같은데 실제 코딩은 Main 화면에서 메시지 이벤트 처리로 하고 있는듯 해서요..
:   >> 답변: 클라이언트가 검~나게 많이 붙으면 부하를 받겠지요.
:                제가 사용해 본 경험으로는 몇백개까지도 무난했던 것 같습니다
:                실제 코드에서 얼마나 부하를 주나에 따라 다르겠지만
:                겨우, 2개 정도면 당연히 그런 걱정 안하셔도 됩듯합니다.
:
: *추가:
:   저도 최근에 JSON 관련해서 사용했는데
:   아직은 관련 클래스가 사용하기 많이 번거롭습니다.
:   특히 C++관련 예제 소스는 거의 없으니 더욱 그렇지요
:
:   아래 링크들을 참고해서 하나씩 알아가 보세요
:   https://chapmanworld.com/2015/01/18/json-with-radstudio-delphi-or-c-builder/
:   https://stackoverflow.com/questions/55568407/how-to-get-json-value-using-tjsonobject-class-in-c-builder
:
:
: 김시환 님이 쓰신 글 :
: : 지금껏 Local 상태로만 장비 제어 프로그램을 해 왔었는데 새로 장비를 개발 하면서 TCP/IP 를 통한 원격 제어 및 모니터링이 가능하게 해 달라는 요청을 받았습니다.
: :
: : 일단 IndyTCPServer 를 이용해서 개발을 하려고 합니다. 통신 프로토콜은 Json 을 사용합니다.
: : TCP/IP 원격 제어를 해 본적이 없어서 몇가지 의문점이 있어서 질문 드립니다.
: :
: : 1. client 가 2군데 이상에서 연결이 되었을 경우 이들을 구분할 수 있나요?
: :     예) master 권한과 단순 모니터링 참가자 ( 실제 제어 권한과 단순 모니터링 권한의 구분)
: :
: : 2. IndyTCPServer 를 잠시 테스트 했을 때 보니 보통 client에서 메시지를 보내면 그 메시지를 받고 OnExecute 에서 이벤트 처리로 응답을 보내게 되어 있던데 Client 에서 메시지를 받지 않는 상황에서 시스템 자체에서 현재 연결되어 있는  Client 들에게 특정 메시지를 보낼 수 있는지요?
: :
: : 3. (2) 번 문항과 같은 의미 일수 있는데 서버는 클라이언트의 요청에 의해서만 응답을 하는 것인가요?
: :
: : 4. OnExecute 이벤트에서 어떤 클라이언트의 요청에 응답을 하게 되면 해당 요청을 한 특정 클라이언트에게만 응답이 가는가요?
: :    아니면 연결된 모든 클라이언트에게 다 응답이 가는가요?
: :
: : 5. 서버가 클라이언트의 메시지에 응답을 하는동안 현재 진행중인 제어에 부담이 되지는 않는지요??  
: :     IndyTCPServer 가 자체적으로 쓰레드를 이용한다고 하는 것 같은데 실제 코딩은 Main 화면에서 메시지 이벤트 처리로 하고 있는듯 해서요..
: :
: : 시대가 변하니 장비제어도 자꾸 새로운 기술들을 접목해 달라고 요구하는데 나이는 먹어서 뭔가 새롭게 한다는게 참 부담스럽네요..
: : 그리고 indy 와  TJSONObject 관련한 자료는 죄다 델파이 뿐이라 파스칼 잘 모르는 제 입장에서는 하나하나 뜻어 분석하는게 얼렵네요.
: :
: :

+ -

관련 글 리스트
75806 Indy TCP Server 관련 문의 김시환 1111 2020/03/25
75807     Re:Indy TCP Server 관련 문의 정성훈.해미 1724 2020/03/25
75809         Re:Re:Indy TCP Server 관련 문의 김시환 1296 2020/03/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.