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
[7013] Re:간단한 1:n 소켓 예제좀 보여 주세여....
방태윤 [nabty] 2811 읽음    2001-04-26 10:33
아래는 여기서 배운 겁니다.
예제도 참고 하면서..
fox라는 부분이 없어서 컴파일은 안될겁니다.
정리하셔서 컴파일 하셔야합니다.
실제로 이걸로 웹서비스하는데 잘됩니다.

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <utilcls.h>

#include "Server.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TFFoxMultiServer *FFoxMultiServer;

void __fastcall AddMsg(bool add_flag,int id,AnsiString str)
{
  if(add_flag){
    FFoxMultiServer->Memo1->Lines->Add("("+AnsiString(id)+")"+str);
    if(FFoxMultiServer->Memo1->Lines->Count>300){
      for(int i=0;i<100;i++){
        FFoxMultiServer->Memo1->Lines->Delete(0);
      }
    }
  }
}


class PACKAGE TMyServerThread : public TServerClientThread
{
  protected:
    void __fastcall ClientExecute(void);
  public:
    __fastcall TMyServerThread(TServerClientWinSocket* ASocket);
    __fastcall ~TMyServerThread();
};
__fastcall TMyServerThread::TMyServerThread(TServerClientWinSocket* ASocket)
    : TServerClientThread(false, ASocket)
{

}
__fastcall TMyServerThread::~TMyServerThread()
{

}

void __fastcall TMyServerThread::ClientExecute()
{
  TWinSocketStream *pStream;
  char buffer[4096];
  bool err;


  while(!Terminated && ClientSocket->Connected){
    try{
      pStream = new TWinSocketStream(ClientSocket,30000);
      try{
        memset(buffer, 0, sizeof(buffer));
        if(pStream->WaitForData(30000)){ // give the client 60 seconds to start writing
          if (pStream->Read(buffer, sizeof(buffer)) == 0 ){
            ClientSocket->Close(); // if can't read in 60 seconds, close the connection
          }else{
            AnsiString s=AnsiString(buffer).Trim();
            AddMsg(FFoxMultiServer->N4->Checked,ThreadID,Time().FormatString("hh:nn:ss")+" "+s);
            if(s.SubString(1,4)=="exe:"){
              AnsiString ss=s.SubString(5,s.Length()-4);
              err=false;
              try{
                fox->Exec(ss);
              }catch(...){
                err=true;
              }
              if(err){
                AddMsg(FFoxMultiServer->N4->Checked,ThreadID,Time().FormatString("hh:nn:ss")+" 폭스구문에러 "+s);
                pStream->Write("폭스구문에러[ok]\n",17);
              }else{
                pStream->Write("[ok]\n",5);
              }
            }else if(s.SubString(1,4)=="ret:"){
              AnsiString r;
              err=false;
              try{
                r=fox->Return(s.SubString(5,s.Length()-4));
              }catch(...){
                err=true;
              }
              if(err){
                AddMsg(FFoxMultiServer->N4->Checked,ThreadID,Time().FormatString("hh:nn:ss")+" 폭스구문에러 "+s);
                pStream->Write("폭스구문에러[ok]\n",17);
              }else{
                r=r.Trim()+"[ok]\n";
                pStream->Write(r.c_str(),r.Length());
              }
            }else{
              AddMsg(FFoxMultiServer->N4->Checked,ThreadID,Time().FormatString("hh:nn:ss")+" ret.exe에러 "+s);
              pStream->Write("ret.exe에러[ok]\n",16);
            }
          }
        }else{
          ClientSocket->Close();
          AddMsg(FFoxMultiServer->N4->Checked,ThreadID,Time().FormatString("hh:nn:ss")+" time out error");
        }
      }__finally{
        delete pStream;
      }
    }catch(...){
      AddMsg(FFoxMultiServer->N4->Checked,ThreadID,Time().FormatString("hh:nn:ss")+" error");
    }
  }
}
//---------------------------------------------------------------------------
__fastcall TFFoxMultiServer::TFFoxMultiServer(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TFFoxMultiServer::FormCreate(TObject *Sender)
{
  InitializeCriticalSection(&cs);

  can_close=false;
  SS->ThreadCacheSize=0;
  fox=new CFoxpro();


}
//---------------------------------------------------------------------------

void __fastcall TFFoxMultiServer::FormDestroy(TObject *Sender)
{
  delete fox;
}
//---------------------------------------------------------------------------
void __fastcall TFFoxMultiServer::SSGetThread(TObject *Sender,
      TServerClientWinSocket *ClientSocket,
      TServerClientThread *&SocketThread)
{
  SocketThread = new TMyServerThread(ClientSocket);
}
//---------------------------------------------------------------------------

void __fastcall TFFoxMultiServer::N4Click(TObject *Sender)
{
  N4->Checked=!N4->Checked;
}
//---------------------------------------------------------------------------

void __fastcall TFFoxMultiServer::N2Click(TObject *Sender)
{
  can_close=true;
  Close();
}
//---------------------------------------------------------------------------

void __fastcall TFFoxMultiServer::N3Click(TObject *Sender)
{
  WinExec("notepad c:\\fox_init_file.txt",SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------

void __fastcall TFFoxMultiServer::tcp1Click(TObject *Sender)
{
  SS->Active=false;
  delete fox;
  Sleep(3000);
  SS->Active=true;
  fox=new CFoxpro();
  TStringList*l=new TStringList();
  l->LoadFromFile("c:\\fox_init_file.txt");
  for(int i=0;i<l->Count;i++){
    fox->Exec(l->Strings[i].Trim());
  }
  delete l;
  AddMsg(true,0,Time().FormatString("hh:nn:ss")+" 초기화ok");


}
//---------------------------------------------------------------------------

void __fastcall TFFoxMultiServer::SSThreadStart(TObject *Sender,
      TServerClientThread *Thread)
{
  AddMsg(true,Thread->ThreadID,Time().FormatString("hh:nn:ss")+" start");
}
//---------------------------------------------------------------------------

void __fastcall TFFoxMultiServer::SSThreadEnd(TObject *Sender,
      TServerClientThread *Thread)
{
  AddMsg(FFoxMultiServer->N4->Checked,Thread->ThreadID,Time().FormatString("hh:nn:ss")+" end");
}
//---------------------------------------------------------------------------

void __fastcall TFFoxMultiServer::FormShow(TObject *Sender)
{
  tcp1Click(Sender);
}
//---------------------------------------------------------------------------


void __fastcall TFFoxMultiServer::FormCloseQuery(TObject *Sender,
      bool &CanClose)
{
  if(!can_close){
    ShowMessage("메뉴의 [프로그램 종료]를 선택하여 종료하세요.");
  }
  CanClose=can_close;
}
//---------------------------------------------------------------------------

.끝.

^^; 님이 쓰신 글 :
: 제가 빌더 버전을 5.X로 바꿨거든여...
: 소켓 컴포넌트가 있던데....
: 간단한 1:n 소켓 예제 좀 보여 주세여.. 컴포넌트를 사용해서여...
: 그냥 클라이언트가 붙기만 하면 메세지 하나만 서버가 보내게 하는 그런 간단한
: 하지만 1:n 을 지원하는 프로그램 예제 하나만 보여주세여...
: 부탁드립니다.... 꾸벅.. ^^

+ -

관련 글 리스트
7011 간단한 1:n 소켓 예제좀 보여 주세여.... ^^; 2196 2001/04/26
7013     Re:간단한 1:n 소켓 예제좀 보여 주세여.... 방태윤 2811 2001/04/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.