|
답변 감사합니다.
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);
: : }
: :
: :
|