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
[40939] Re:Re:항상 감사드립니다 __)
★래미★ [jackey9] 1055 읽음    2005-07-07 20:52
언제나 세심하게 설명해주셔서 넘 감사합니다..
항상 많은 도움을 받고 있네요 __)

황경록 님이 쓰신 글 :
: 우선 클라이언트 컨텍스트(서버 프로그램이 동작되고 있는 동안 접속한 클라이언트 정보를 관리하는 그 무엇...)를
: 정의하는 방법이 있겠습니다.
:
: OnConnect 나 아니면 OnExecute 에서 클라이언트가 인증(?) 접속허가(?) 등의 패킷을 보내면 클라이언트
: 컨텍스트를 생성하고 인디에서 관리해주는 쓰레드의 핸들을 키 값으로 사용하시면 될듯합니다.
:
: 간단하게 만들어 보면
:
: class TCli
: {
: public:
:     AnsiString szKey;
:     HANDLE hThread;
:     TIdPeerThread* pContext;
:    
:     AnsiString szClientIP;
: };
:
: 이런정도로 그리고
: TCli 는 컨테이너 객체 TList 나 TThreadList 나 THashedStringList 등 아무거나 편한걸로 용도에 맞게
: 관리해 주시면 될듯...
:
: 그럼 이제 OnExecute 에서
:
: 클라이언트가 "나를 컨텍스트에 등록해라"라는 패킷을 보낸다고 가정하면(음.. 이런 인증(?)이 필요없다면 OnConnect 에 코딩하시면 될듯)
:
: void __fastcall TForm1::mTCPSrvExecute(TIdPeerThread *AThread)
:
: TCli* pCli = new TCli();
: pCli->pContext = AThread;
: pCli->hThread = AThread->Handle;   <-- 음 맞나? 확인해서 하세요.... ^^
: pCli->szClientIP = AThread->Connection->Socket->Binding->PeerIP; // Peer IP <-- 이것도 맞는지 확인해보세
: 요;;;
:
: 암튼 이런식으로 해서 pCli 를 리스트로 등록하고
: 특정 클라이언트에게 뭔가 보내려면 리스트에서 해당 IP 를 찾아(뭐.... 잘~)
:
: Thread->Connection->Write( ... );
:
: 대략 이런식으로 해주면 되지 않을까요?
:
: -_-;;; 므흐흐흐...
:
: 아 그리고 별도의 리스트를 사용하는데 불만(?)이라면
:
: TCPSrv->Threads 이게 TThreadList 로 현재 접속되어 있는 클라이언트의 컨텍스트정보죠...
:
: 그럼 결국 TIdPeerThread 의 Data <- 이것이 아마 초기에 널(NULL) 일겁니다.
:
: 그럼
:
: TIdPeerThread *p ->Data = pCli;
:
: 이런식으로 넣어주셔도 되겠죠 ^^
:
: 단... OnDisconnect 에서 메모리 해제해주시는 건 잊으시면 안되겠죠..
:
: 헤헤 그냥 두서 없이 써서 -_- 정신이 산만하네요;;;
:
: 뭐... 아마... 빠진 부분(?) 잘 보시면 다 나올듯...-_-'''
:
:
:
:
: ★래미★ 님이 쓰신 글 :
: : 우선..하나부터 열까지 일일이 질문드려서 정말 죄송;;
: : 혼자 해보려고 이것저것 해봐두 잘 안되네요 ㅠㅠ
: :
: : 팁앤트릭에서 IP 알아내기 참고해서 다음과 같이 작성했구요..
: : 일단 서버-클라이언트 통신은 잘 되었네요..
: :
: : 질문1) TCPServer->Bindings->Items[i]->PeerIP는
: : 서버에 접속된 클라이언트들의 IP를 자동으로 수집하는 건가요?
: : 아니면 TCPServer->Bindings 에 사용자가 설정해 놓은 값을 나타내는 건가요?
: : (테스트 해보니 통신이 잘 이루어지는 상태에서도 PeerIP는 NULL 이었어요.. 로컬 IP는 0.0.0.0 이었구요..
: : 참.. GStack->LocalAddresses->Strings[0] 에서 로컬 IP는 잘 들어왔어요)
: :
: : 질문2) PeerIP를 자동으로 수집할려면 어떻게 해야 하나요?
: : 아래 코드에 문제가 있는것 같네요..
: :
: : 질문3) TCPServer OnExecute()에서는 생성된 AThread 가지구 PeerIP 알 수 있는 방법이 있나요?
: : (음.. 2번과 약간 중복될 수도 있네요..)
: :
: : 그럼... 이 답답함을 해결해 주시리라 믿으며.. 꾸벅 __)
: :
: :
: : //---------------------------------------------------------------------------
: : void __fastcall TForm1::SendToClient()
: : {
: :     //send data
: :     char sBuf[BUF_SIZE];
: :     sprintf(sBuf, "Server -> Client Test Message!");
: :
: :     TThreadList* thdlist = TCPServer->Threads;
: :     TList* list = thdlist->LockList();
: :     if(list->List==NULL) {thdlist->UnlockList(); return;}
: :     TIdPeerThread* thd;
: :     TIdTCPServerConnection* con;
: :
: :     RichEdit2->Clear();
: :     try
: :     {
: :         for(int i = 0; i < list->Count; i++){
: :             thd = (TIdPeerThread*)list->Items[i];
: :             con = thd->Connection;
: :             con->WriteBuffer(sBuf, BUF_SIZE);        //write
: :
: : //            Edit1->Text = GStack->LocalAddresses->Strings[0];
: :             AnsiString localIP, remoteIP;
: :             localIP = TCPServer->Bindings->Items[i]->IP;  //local IP
: :             remoteIP = TCPServer->Bindings->Items[i]->PeerIP;    // remote IP
: :             RichEdit2->Lines->Add("localIP = " + localIP);
: :             RichEdit2->Lines->Add("remoteIP = " + remoteIP);
: :         }
: :     }
: :     __finally
: :     {
: :         thdlist->UnlockList();
: :     }
: : }
: : //---------------------------------------------------------------------------

+ -

관련 글 리스트
40935 [질문] TCPServer에 접속된 Client의 IP를 알고 싶은데요.. ★래미★ 1166 2005/07/07
40937     Re:[질문] TCPServer에 접속된 Client의 IP를 알고 싶은데요.. 황경록 2083 2005/07/07
40939         Re:Re:항상 감사드립니다 __) ★래미★ 1055 2005/07/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.