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
[58980] Re:[질문]공유기를썼을때의 문제...
이호원 [kamizen] 1003 읽음    2009-11-03 17:58
음.. 일단채팅서버가 공유기 밖에.. 혹은 DMZ 영역 안에 있다고 가장하고..
나머지 2대( 3대라고 하셨으니깐염..)에 챗 클라이언트가 있다고 가정을 해봅시다..
그 서버가 1000개 정도 클라이언트 받고 외부 ( 공유기 말고 친구 집 같은데서 )에서 클라이언트들이 붙을 때 ..

편한 방법은.. 서버가 TServerSocket 기준으로 하면 ... ClientConnect 이벤트가 발생할 때...
1000개짜리 Client Connection Pool을 사용해서 그 때 발생한 Connection을 서버가 가지고 있는 방법이 나름 편하게 만드실수 있는 길이 아닌가 생각해봅니다... 아무리 공유기에서 할당해주는 IP를 쓰는 PC라고 해도.
써버가 개별 클라이언트 Socket 정보를 다 가지고 있으면.. 인덱싱해서 해당 소캣 끼리 자료 송수신만 할수 있게 해주면 괜챦지 않을까 싶네요..

id로 인덱싱 해서 전송자의 text나 데이타를 대상자의 소캣에 write 하는 방식으로 뿌려도 괜챦을 거같네요..

저는 갠적으로 아래 루틴을 사용했었던 적이 있군요..

TCustomWinSocket *clientsocket[MAX_CLIENT_COUNT];

memset( clientsocket , 0x00 , sizeof( clientsocket ));

void __fastcall Ttcpserverform::serversocketClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
    clientcnt += 1;
    RichEdit1->Lines->Add( ">>현재" + IntToStr( clientcnt ) +"건 접속 중" );
    for( int i = 0 ; i < MAX_CLIENT_COUNT ; i ++ )
    {
        if( clientsocket[i] == 0x00 )
        {
            clientsocket[i] = Socket;
            break;
        }
    }
}

void __fastcall Ttcpserverform::serversocketClientDisconnect(
      TObject *Sender, TCustomWinSocket *Socket)
{
    clientcnt -= 1;
    RichEdit1->Lines->Add( ">>현재" + IntToStr( clientcnt ) +"건 접속 중" );
    for( int i = 0 ; i < MAX_CLIENT_COUNT ; i ++ )
    {
        if( clientsocket[i] == Socket )
        {
            clientsocket[i] = 0x00;
            break;
        }
    }
}

void __fastcall Ttcpserverform::serversocketClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
    AnsiString txt = Socket->ReceiveText();

    RichEdit1->Lines->Add( txt );
    int  i , j ;
    for( i = 0 , j = 0 ; i < MAX_CLIENT_COUNT ; i++ )
    {
        if( clientsocket[i] != 0x00 )
        {
            clientsocket[i]->SendText( txt );
            j++;
        }
    }
    RichEdit1->Lines->Add( ">>" + String( j ) +"건 송신");
}

쪼매라도 도움이 되셨기를 빕니다. 즐플하삼~~!

차베스 님이 쓰신 글 :
: 안녕하세요~~^^ 항상 질문만 올리는 호접한 프로그램개발자입니다.
: 간단한 채팅프로그램 하나 못만들어서 징징거리는 사람입니다.
: 고정IP로 한개 IP를 할당받아서 공유기로 컴터 3개에 물려 돌아가는 시스템이 있슴다.
: 아~ 물론 그중에컴터 한개는 가상서버 설정을 해서 서버로 잡아놓긴 했습니다.
: 제가 쓰는컴터는 서버가 아닌 다른 컴터에서 공유기가 할당해주는 IP를 받아서
: 사용합니다.
: 근데.... 다른 메신저프로그램들을 보면.... 그 상황에서도 참 잘 돌아가던데...
: 제가 만든 채팅프로그램은 안돌아가는게 의문입니다.
: 채팅프로그램 서버는 우리고정아피받은 서버이고,
: 외부에서 제가만든 프로그램 가동시... 접속 잘됩니다...
: 문제는 거기서 제가 제 컴터에서 현재 접속한 사람과 채팅하려 하는데....
: 거참..... 안되네요....
: 그쪽에서는 단순히 고정IP번호만 알고....
: 공유기를 거처서 제 컴터까지 오게끔 하는 방법이 있으니까
: 다른 메신저들이 잘 돌아가는거같은데....
: 애공..... 고 방법은 책에도 안나와 있네요.....
: 제가 상황 설명을 잘 했는지는 모르겠습니다만...
: 필이 팍~~ 꽂히시는 분은 바리 답변 해주시면 대단히 감사하겠슴다~~
: 애고~ 참고로... 이사이트 없었으면 나 어떻게 프로그램 짰을까 ㅋㅋㅋ
:

+ -

관련 글 리스트
28565 [질문]공유기를썼을때의 문제... 차베스 799 2004/01/19
58980     Re:[질문]공유기를썼을때의 문제... 이호원 1003 2009/11/03
28597     Re:[질문]공유기를썼을때의 문제... 유영인 Cuperido 902 2004/01/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.