|
리눅스 클라이언트는 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);
: }
:
:
|