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
[51479] Re:Re:[질문] TClientSocket, TServerSocket 통신 하기
mister [vsado] 2469 읽음    2007-12-05 09:50
장성호 님이 쓰신 글 :
: 좀 어렵게 하시네요
:
: TClientSocket  , TServerSocket은?
: 타입이 Blocking 모드 보다 NonBlocking  모드가 코딩이 간편하고
: 더 잘맞는것 같습니다.
: 대개 TClientSocket  , TServerSocket 은 NonBlocking 모드로 대게 쓰구요..
:
: ...
:
: 간단하게..
: 둘다 NonBlocking  으로 설정하시구요
:
: 서버는  OnClientRead이벤트 함수에서
: ServerSocket1ClientRead    읽으시면 되구요
:
: 클라이언트는 OnRead이벤트에서 읽으시면 됩니다. ClientSocket1Read
:
:
: void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
:       TCustomWinSocket *Socket)
: {
:     String str=Socket->ReceiveText();
:     Memo1->Lines->Add(str);
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
:       TCustomWinSocket *Socket)
: {
:     String str=Socket->ReceiveText();
:     Memo1->Lines->Add(str);
: }
: //---------------------------------------------------------------------------
:
:
: 그럼..
:
:
: mister 님이 쓰신 글 :
: : 제가  BCB4로 처음 시도를 해 보는데요..
: : client와 sever 간에 처음 접속은 되더군요..
: : OnAccept, OnConnect  이벤트는 서버쪽에서 알아 듣습니다. 하지만  OnGetThread는 전혀 알아 듣지 못하네요..
: : 그리고 client쪽에서 ClientSocket->SenText("~~~~")를 해주면 Server쪽에선 OnGetSocket 쪽에서 처리를 해 줘야
: : 하나요.. help에서는 소켓 쓰레드와  스트림을 쓰던데 그 방법대로 해도 OnGetThread가 안되고요..
: : 클라이언트에서 값을 pStream->Write(~~~)하면 몇번을 쓰고 멈춰 버리더군요..
: :
: :
: : 강좌나 질답을 검색해도, 제가 처음이라 안되네요.. 소스를 올려보겠습니다.
: : 잘못된 부분이나 추가 해야 할 사항이 있으면 알려주세요..
: : 간단하게 문자를 주고 받는 정도만 이해 하면 됩니다.
: :
: :
: :
: : //-------------------- 클라이언트 쪽 -------------------------------
: :
: : //접속 버튼 입니다.
: : void __fastcall TForm1::Button1Click(TObject *Sender)
: : {
: :     if (ClientSocket1->Active)
: :     {
: :         ClientSocket1->Active = false;
: :         Sleep(1000);
: :     }
: :
: :
: :
: :     try
: :     {
: :         ClientSocket1->ClientType = ctBlocking;
: :         ClientSocket1->Host = "192.168.10.125";
: :         ClientSocket1->Port = 8080;
: :         ClientSocket1->Active = true;
: :         ShowMessage("  ++  Server 에 접속합니다.  ++  ");
: :     }
: :     catch ( ... )
: :     {
: :         ShowMessage("  ++  Server 접속에 실패 했습니다, 서버를 실행해 주세요 !  ++  ");
: :     }
: : }
: :
: : //OnConnect 이벤트
: : void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
: :       TCustomWinSocket *Socket)
: : {
: :     cliSocket = Socket;
: :     Memo1->Lines->Append("Client Connect to Server");
: :
: : }
: : //
: :
: : //메시지를 보내는 부분입니다.
: : void __fastcall TForm1::SendSocket()
: : {
: :     char sendBuffer[BUFFERSIZE];
: :     char buffer[BUFFERSIZE];
: :     bool bCompleted = false;
: :     memset(sendBuffer, '\0', BUFFERSIZE);
: :
: :     while (!bCompleted && cliSocket->Connected)
: :     {
: :         try
: :         {
: :             TWinSocketStream* pStream = new TWinSocketStream(cliSocket, CLIENTWAITTIME);
: :
: :             try
: :             {
: :                //서버로 보내고
: :                 memset(buffer, '\0', BUFFERSIZE);
: :                 memset(sendBuffer, '\0', BUFFERSIZE);
: :                 Form1->Memo1->Lines->Append("Send to Serever");
: :                 strcpy(sendBuffer,  "Client Message!");
: :                 pStream->Write(sendBuffer, strlen(sendBuffer));
: :            
: :                //받으려 합니다.
: :                 if (pStream->WaitForData(CLIENTWAITTIME))
: :                 {
: :                     Form1->Memo1->Lines->Append("receive data");
: :                     if (pStream->Read(buffer, BUFFERSIZE) == 0)
: :                         cliSocket->Close();
: :                     else
: :                     {
: :                         Form1->Memo2->Lines->Append(AnsiString(buffer));
: :                         Form1->Memo2->Lines->Append("receive Message");
: :
: :                         bCompleted = true;
: :                         //code here
: :                     }
: :                 }
: :                 else
: :                 {
: :                     Form1->Memo1->Lines->Append("wait fail");
: :                     cliSocket->Close();
: :                 }
: :             }
: :             __finally
: :             {
: :                 delete pStream;
: :             }
: :         }
: :         catch (...)
: :         {
: :             Memo1->Lines->Append("Fail Stream");
: :         }
: :     }
: :
: :     if(cliSocket->Connected)
: :     {
: :         cliSocket->Close();
: :     }
: :
: :
: : }
: :
: : //------------------------------- 서버 쪽---------------------------------------
: :
: : //Thread
: : void __fastcall TForm1::ServerSocket1GetThread(TObject *Sender,
: :       TServerClientWinSocket *ClientSocket,
: :       TServerClientThread *&SocketThread)
: : {
: :     SocketThread = new TMyServerThread(false, ClientSocket);
: : }
: : //
: :
: :
: : //처리 부분
: :
: :
: :
: : void __fastcall TMyServerThread::ClientExecute(void)
: : {
: :     char sendBuffer[BUFFERSIZE];
: :     char buffer[BUFFERSIZE];
: :
: :     while (!Terminated && ClientSocket->Connected)
: :     {
: :         Form1->Memo2->Lines->Append("recieve message");
: :
: :         try
: :         {
: :             TWinSocketStream* pStream = new TWinSocketStream(ClientSocket, CLIENTWAITTIME);
: :
: :             try
: :             {
: :                 memset(sendBuffer, '\0', BUFFERSIZE);
: :                 memset(buffer, '\0', BUFFERSIZE));
: :
: :                 if (pStream->WaitForData(CLIENTWAITTIME))
: :                 {
: :                     Form1->Memo1->Lines->Append("receive data");
: :                     if (pStream->Read(buffer, BUFFERSIZE) == 0)
: :                         ClientSocket->Close();
: :                     else
: :                     {
: :                         Form1->Memo2->Lines->Append(AnsiString(buffer));
: :                         Form1->Memo1->Lines->Append("Send to Client");
: :                         strcpy(sendBuffer, "receive ok");
: :                         pStream->Write(sendBuffer, strlen(sendBuffer));
: :                         memset(buffer, '\0', BUFFERSIZE);
: :
: :                         //code here
: :                     }
: :                 }
: :                 else
: :                 {
: :                     Form1->Memo1->Lines->Append("wait fail");
: :                     ClientSocket->Close();
: :                 }
: :             }
: :             __finally
: :             {
: :                 delete pStream;
: :             }
: :         }
: :         catch (...)
: :         {
: :             HandleException();
: :         }
: :        
: :     }
: : }

^^ 네 비동기식은 잘 되네요 감사합니다.
아쉬운것은 제가 올렸던 소스에서의 지적이 없네요... 혹시 조언 있으시면 답변 부탁 드립니다.

+ -

관련 글 리스트
51464 [질문] TClientSocket, TServerSocket 통신 하기 mister 1913 2007/12/04
51474     Re:[질문] TClientSocket, TServerSocket 통신 하기 장성호 4628 2007/12/05
51479         Re:Re:[질문] TClientSocket, TServerSocket 통신 하기 mister 2469 2007/12/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.