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
[1036] TTcpClient/TTcpServer 컴포넌트 간단 예제.
김태선 [cppbuilder] 21773 읽음    2011-02-20 11:22
인디 보다는 성능이 떨어지지만
인디 사용하지 않을때 간편하게 사용하기 좋은게 TTcpClient / TTcpServer 입니다.
인디 정도로 세밀하게 제어하는게 안되지만 간단한 용도로는 괜잖습니다.
TTcpClient / TcpServer 사용법이 비슷한데,
간단히 예제로 만들어 봤습니다.

참고로
TClientSocket / TServerSocket 는 버그도 있고 성능도 나빠 않쓰는게 좋습니다.
TClientSocket는 간단한 용도로 쓰는 것도 나쁘지 않지만
TServerSocket는 성능이 조금 나쁩니다. 접속을 제대로 인지 못하는 경우가 가끔 있는데,
물론 용도에 따라서는 사용해도 되겠지요.

//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    try
    {
        do
        {
            TcpClient2->RemoteHost = "www.yahoo.co.kr";
            TcpClient2->RemotePort = 80;
            TcpClient2->Connect();
            if (!TcpClient2->Connected)
                break;
            TcpClient2->Sendln("GET /");
            String s;
            do
            {
                s = TcpClient2->Receiveln("\n");
                Memo1->Lines->Add(s);
            } while(s != "");
        } while(false);

        // 접속되던 안되던 반드시 Disconnect 메소드를 호출해주어야
        // Handle이 반환되어 종료시 불필요한 이벤트 발생을 막을 수 있다.
        //
        TcpClient2->Disconnect();
    }
    catch(...)
    {
        Memo1->Lines->Add("TcpClient는 Indy와 달리 에러시 예외가 발생하지 않는다.");
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2Connect(TObject *Sender)
{
    Add("# connect");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2CreateHandle(TObject *Sender)
{
    Add("# create handle ");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2DestroyHandle(TObject *Sender)
{
    Add("# destory handle ");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2Disconnect(TObject *Sender)
{
    Add("# disconnect");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2Error(TObject *Sender, int SocketError)
{
    Add("# error");
    Add(SocketError);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2Receive(TObject *Sender, PChar Buf,
      int &DataLen)
{
    Add("# recv");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2Send(TObject *Sender, PChar Buf,
      int &DataLen)
{
    Add("# send");
}
//---------------------------------------------------------------------------



Add는
    void    Add(String s)
    {
            Memo1->Lines->Add(s);
    }


접속시 이벤트 발생순서는
# create handle
# connect

# send

# recv

# disconnect
# destory handle



TTcpServer 간단 예제는
서버는 접속이 발생하면 GetThread 이벤트가 발생하는데
이때 필요한 만큼 쓰레드가 생성되고,
이후 아래 Accept 핸들러로 접속 클라이언트 소켓을 가지고 제어가 넘어오게 됩니다.
여기서 마치 인디의 Execute 핸들러처럼 작업해주면 됩니다.
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpServer1Accept(TObject *Sender,
      TCustomIpClient *ClientSocket)
{
    Add("# accept");
    int len;

    // thread loop
    //
    do
    {
        len = ClientSocket->ReceiveBuf(&t, size, 0);
        ClientSocket->SendBuf(data, size);

    // 클라이언트 접속이 종료되거나 에러가 나면 len이 0 값이 넘어 온다.
    } while(len > 0);
    ClientSocket->Close();
    Add("# end accept");
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
1036 TTcpClient/TTcpServer 컴포넌트 간단 예제. 김태선 21773 2011/02/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.