|
아래는 여기서 배운 겁니다.
예제도 참고 하면서..
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 을 지원하는 프로그램 예제 하나만 보여주세여...
: 부탁드립니다.... 꾸벅.. ^^
|