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
[35178] Re:Re:Re:제목] TCPClient 가 데이타를 받을 때... 잘 안받아지는 현상.
윤승일 [] 1617 읽음    2004-05-25 08:11
DataAvailable event 는 Indy component가 데이터를 받았을때 발생하는 이벤트를 말한 것이구요,

아래 리눅스로 짠 코드는 윈도우에서 그대로 쓸수 있습니다.
단 윈속을 사용해야 하므로 해줘야 할게 있죠.
socket() 콜을 하기 전에 WSAStartup() 을 호출해야 하고 
소켓 close 시에도 closesocket() 을 사용해야 하고
wsock32.lib를 link 해야 합니다.
윈속(WinSock) 사용 예제는 책에 많이 나와 있을 겁니다.


초록물고기 님이 쓰신 글 :
: 답변 감사합니다.
: DataAvaialbe event 란 것이... 그런 프로퍼티가 있는 것인지,,, 아니면 다른 일반적인 ...
: onconnect, OnExecute 등을 통털어 말 씀하시는 것인지요?
:
: 말씀 하신 event drive방식 말고,, 제가 했던 리눅스 프로그램처럼...
: 컴포넌트를 사용하지 않고 , 그렇게 루프를 돌면서..데이타를 받을 수 있는 방법은 없는지요?
: 그럴수 있다면,, 간단히 참고 할 수 있는 ... example 소스 같은 것좀 구할 수 있는지요?
:
: 답변 다시 한번 감사드리며..
:
: 윤승일 님이 쓰신 글 :
: : 리눅스 클라이언트는 Event Driven 방식이 아니므로 아래처럼 while 루프로 받는 것이 맞지만.
: : indy component는 event driven 방식으로 써야 합니다.
: : DataAvailable event가 떠야 받을수 있는데 쓰신 코드를 보면 click event 내에서 while loop로 계속
: : 돌고 있으니...  DataAvailable event 가 발생하지 않으므로 데이터를 받지 못합니다.
: :
: :
: : 초록물고기 님이 쓰신 글 :
: : : 안녕하세요... tcp /ip 에서 궁금한 점이 있어 질문드림니다.
: : : 서버프로그램은  리눅스 에서 실행되는 tcp 서버입니다.
: : : 서버의 구조는 클라이언트와 connection 이 이루어진후...
: : : 데이타를 계속해서 보내는 그런 간단한 구조입니다.
: : :
: : : 당연히 클라이언트 접속이 이루어지는 데이타를 계속해서 받아들이는 구조의 client 입니다.
: : : 아래의 client 프로그램은  tcp서버에 접속하여... 데이타를 계속 받아들이면서...
: : : 계속해서 잘 돌아갑니다.
: : :
: : : C++ builer에서도 특정 버튼이 눌린후에 ...데이타를 받기위해
: : : 아래의 indy client example에서 처럼.. 아래와 같이 간단히 코드를 삽입했습니다.
: : : 콤포넌트는 TidTCPClient 입니다.
: : :
: : : 그런데 데이타를 한번도 못 받아 냅니다.
: : : 분명 아래와 같은 구조를 하고 있는 리눅스 client는 데이타를 모두 잘 받아 냅니다.
: : : ReadLn 과 비슷하게, ReadString함수도... 데이타를 못 읽어내는 현상이 나타남니다.
: : :
: : : 리눅스 client와 TCPClient사이에 어떤 차이점이 있어 , 잘 받아지지 않는 것인지요.
: : : 아니면.. 특별히 주의해야 할 것이있는지요?
: : :
: : :
: : : ========= 버튼이 눌렸을 동작하는 TCPClient ============
: : : void __fastcall TForm2::btnGoClick(TObject *Sender)
: : : {
: : :
: : :    TCPClient->Connect();
: : :    TCPClient->Write("client connedted");
: : :  
: : :    while (1)
: : :     {
: : :      try
: : :      {
: : :           ListBox1->Items->Add(TCPClient->ReadLn());
: : :      }
: : :      __finally
: : :      {
: : :           TCPClient->Disconnect();
: : :      }
: : :    }
: : : }
: : :
: : :
: : : //////////리눅스에 동작하는 서버의 구조 //////////
: : : main()
: : : {
: : :   int count = 0;
: : :   char buf [128];
: : :
: : :   //클라이언트와 connection 이후  계속해서 데이틀 클라이언트에 보낸다.
: : :   read(...)  //==> "client connected" 라는 문자열이 처음에 ..읽혀진다.
: : :   while ( 1) //그이후 데이타를 무한히 보내려 합니다.
: : :   {
: : :        sprintf( buf , "message = %04d\n" , count ++ );
: : :        send (sock, buf , strlen(buf), 0); ////연결된 클라이언트에 0.1 정도 간격으로계속해서 보냅니다.
: : :
: : :        usleep (100)
: : :   }
: : : }
: : :
: : : ====리눅스에서 동작하는 tcp client 구조..===
: : : int main(int argc, char **argv)
: : : {
: : :
: : :         int client_len;
: : :         int clientSock;
: : :         int first = 0;
: : :         int n;
: : :
: : :         pthread_t sndThread , rcvThread;
: : :         void *threadResult;
: : :
: : :         FILE *fp_in;
: : :         char id [512];
: : :
: : :
: : :         struct sockaddr_in clientaddr;
: : :         sprintf (Name, "%s", argv[3] );
: : :
: : :         clientSock = socket(AF_INET, SOCK_STREAM, 0);
: : :         clientaddr.sin_family = AF_INET;
: : :         clientaddr.sin_addr.s_addr = inet_addr(argv[1]);
: : :         clientaddr.sin_port = htons( atoi (argv [2]) );
: : :
: : :         client_len = sizeof(clientaddr);
: : :
: : :         if (connect(clientSock, (struct sockaddr *)&clientaddr, client_len) < 0)
: : :         {
: : :                 perror("Connect error: ");
: : :                 exit(0);
: : :         }
: : :         while (1)
: : :         {
: : :                 memset ( id , '\0' , sizeof ( id ) ) ;
: : :                 n = read ( clientSock , id , 512);
: : :                 if ( n == -1 ) return (void *) NULL;
: : :                 id [n ] = '\0';
: : :                 fprintf (stderr, "recv = [%s]\n" , id );
: : :
: : :         }
: : :         exit(0);
: : : }
: : :
: : :

+ -

관련 글 리스트
35153 제목] TCPClient 가 데이타를 받을 때... 잘 안받아지는 현상. 초록물고기 1542 2004/05/23
35173     Re:제목] TCPClient 가 데이타를 받을 때... 잘 안받아지는 현상. 김상면 1552 2004/05/24
35168     Re:제목] TCPClient 가 데이타를 받을 때... 잘 안받아지는 현상. 윤승일 1553 2004/05/24
35169         Re:Re:제목] TCPClient 가 데이타를 받을 때... 잘 안받아지는 현상. 초록물고기 1503 2004/05/24
35178             Re:Re:Re:제목] TCPClient 가 데이타를 받을 때... 잘 안받아지는 현상. 윤승일 1617 2004/05/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.