C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[460] [참고] BROADCAST로 SERVER 장비 찾기
박영목 [gsbsoft] 7633 읽음    2005-05-11 15:06
BROADCAST로 SERVER 장비 찾기

VC쪽에도 올린다고 아래의 내용을 추가한 것입니다. Builder를 자랑스럽게 여기는
분들 화내지 마시길 바랍니다. 저도 Builder 엄청 좋아합니다. ㅎㅎㅎ

아래의 소스는 Borland C++Builder로 되어 있습니다. 지금 옮김 회사도
VC++를 사용하내요....  ㅋㅋㅋ 저렇게 노가다를 해야할까?
제가 TEST해 보았는데... C++Builder도 아주 안정적입니다. ㅎㅎㅎㅎ
어떻게 보면 BUG를 더 많이 줄일 수 있고 일도 몇배로 빨리 끝낼 수 있습니다.
핵심부분만 VC++로 인터페이스나... DB나 이런 것들 C++Builder로 해 보세요...
아니면 다 Builder로 하셔도 되고... 현재 그래프 그리는 것 Builder로 만들어 놓았는데...
ㅎㅎㅎ VC로 한것과 조금도 속도 차이가 없습니다. 그리는 것을 API로 헀기 때문에....

저는 지금도 VC로 해라고 하지만 TEST할 때는 Builder를 사용합니다. 아마 이 TEST 부분만
만드는 것도 시간을 엄청 줄일 수 있습니다.  여러 툴들 썪어서 사용해 보시길....


현재 LINUX Embedded 쪽의 서버의 구상 중인데 저런 장치가 많다.
IP를 일일이 적어 놓고 할 때마다 입력해야 할까?
그냥 CLIENT(PC) 프로그램을 run 하면 LAN으로 연결되어 있는 장치들이
IP를 다 보내 주면 LIST 목록에 나타나게 하고 그 중 하나를 그릭하면
하면 바로 TCP로 접속해서 작업을 하도록.... 이게 좋을 것 같아.... 물론
대부분의 장비들이 이렇게 동작하고 있네요... ㅋㅋㅋㅋ
어떻게 할까? 고민 반나절 하다 BROADCAST로 TEST하니까? 잘 되네요....

혹 필요한 분들 반나절 시간을 아끼라고 올려봅니다... 아시는 분은...
그냥 지나 가시고....


//물론 서버쪽은 리눅스에서 돌아가도록 GCC로 만들어야 하지요.... ㅋㅋㅋㅋ

(서버쪽) 은 PORT 번호만 입력하면 되고
void __fastcall TForm1::IdUDPServer1UDPRead(TObject *Sender,
      TStream *AData, TIdSocketHandle *ABinding)
{
  char str[100];
  int  nnn;

  nnn = AData->Size;

  AnsiString Buff, asIP, asPORT;

  asIP   = ABinding->PeerIP;
  asPORT = ABinding->Port;


  AData->ReadBuffer( str, nnn );
  str[nnn] = 0x00;
  Buff = asIP + ", " + asPORT + ", " + str;
  Memo1->Lines->Add( Buff );      //그냥 DEBUG용입니다.
                                  //여기서 나도 이 시스템이라는 메세지를 Client에 보내면 되겠지요.
}
//---------------------------------------------------------------------------

(CLIENT) 는 아래와 같이 하되  PORT 번호도 주어야 합니다.
void __fastcall TForm1::btnSendClick(TObject *Sender)
{
  char str[100];
  AnsiString asStr;

  int i;
                                       //Lan에 물려져 있는 모든 장치를 찾기 위해서
  i=1;
  while( i<224 )                       //PC의 네트웍 IP 지정하는 곳에서 맨 앞자리 IP를 지정해 보면 1~223 까지 입력하라고 나옵니다.
  {
    if( i==127 ) { i++; continue; }    // 127.0.0.0 is local IP

    asStr = IntToStr( i ) + ".255.255.255";

    IdUDPClient1->Active = false;
    IdUDPClient1->Host =   asStr;
    IdUDPClient1->Active = true;

    wsprintf( str, "Request RX-100%c%c", 0x0D, 0x0A );   //Client에서 이렇게 보내면 서버에서
    IdUDPClient1->SendBuffer( str, strlen(str) );        //이 문자들을 확인하고 자기 장치이면 신호를 보내면 되겠지요

    i++;
  }

}

이만.... 현재 객지 생활 중... 부산에서 취직이 되지 않아 마산으로 옮겼습니다.... 우리 애들 많이 보고 싶다.
1 주일에 한번 보는데.... 기러기 아빠들.... 힘내세요....  "아빠 힘내세요... 우리가 있잖나요...~~~"
박영목 [gsbsoft]   2005-05-13 12:42 X
i=1;
while ... 이후 별 필요하지 않는 것 같습니다.
그냥 PORT 번호를 255.255.255.255로 한번만 하시면 됩니다.
제가 잘못 생각을 했습니다.   ㅋㅋㅋㅋ 죄송
박영목 [gsbsoft]   2005-06-02 09:09 X
제가 너무 무식한 것 같습니다. 무식하면 관찰이라도 잘 해야 하는데... 너무 기쁜 나머지 오류를 범했습니다.UDP도 IP가 서로 통신할 수 있는 범주에 있으야 가능합니다. 지금 TEST했습니다. 그런데 장비의 IP가 PC IP를 범주를 벗어날 때 서로 통신방법은 둘 다 서로 broadcast를 사용해야 합니다. Client만 사용하고 서버는 그 받은 포트로 보낼 경우 같은 IP 범주에 들지 못하면 Client는 응답을 받지 못합니다. 결론은 양쪽다 BROADCAST로 날려야 한다.
그러면 장비의 IP가 범주에 들지 않으면 IP 밖꾸는 기능을 넘어서 바꾸고 그 다음 정상적으로 PORT를 열어서 통신을 하면 됩니다. 끝........

+ -

관련 글 리스트
460 [참고] BROADCAST로 SERVER 장비 찾기 박영목 7633 2005/05/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.