|
안녕하세요... 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);
}
|