|
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);
: : : }
: : :
: : :
|