|
소켓 프로그램은 왠만하면 UNIX에서 사용하는 버클리 소켓 방식을 이용하시기 바랍니다.
MFC의 CSocket클래스도 좋긴한데 에러가 있는 경우도 있고 호환성이 문젭니다.
LINUX에서는 프로그램을 안해 봐서 모르지만 CSocket은 안되더라도 버클리 소켓을 지원되리라 생각합니다.
C++Builder에는 콘트롤 형태로 소켓을 제공하는것 같던데 제가 생각하기엔 별롭니다.
먼저 답변을 하신분의 글을 보면 특정 이벤트를 사용해야 한다는데 그러면 호환성에서 문제가 생깁니다.
하지만 버클리 소켓은 운영체제에 따른 약간의 문제만 해결하면 그냥 호환이 된다고 하니 아예 C++을 하신다면 자신이 직접 버클리 소켓을 이용해서 범용 클래스를 만드는게 좋을듯합니다. 저도 한번 만들어 봤는데 별로 어렵지 않게 MFC의 CSoket만큼의 기능을 하는(거의 똑 같았음) 소켓 클래스를 만들수 있더군요
공부를 해야한다면 버클리 소켓에 대해서 소개해 놓은 책이나 주위 분에게 물어 보세요
그럼
초록물고기 님이 쓰신 글 :
: 안녕하세요... 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);
: }
:
:
|