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
[75807] Re:Indy TCP Server 관련 문의
정성훈.해미 [sage5nor] 1721 읽음    2020-03-25 15:03
제가 알고 있는 선(고급 지식 아님)에서
알려드립니다.

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 관련 문의 김시환 1110 2020/03/25
75807     Re:Indy TCP Server 관련 문의 정성훈.해미 1721 2020/03/25
75809         Re:Re:Indy TCP Server 관련 문의 김시환 1294 2020/03/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.