달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'BackEnd/C'에 해당되는 글 1건

  1. 2013.12.26 Unix C Socket Programming

Unix C Socket Programming

BackEnd/C 2013. 12. 26. 14:46

처음부터 만든건 아니고.. 기존에 있던 Unix c socket program을 수정할 일이 있었다.

C사에서 예전부터 만들어둔 소스인데 미리 정해둔 client가 아닌경우 접속을 허용하지 않도록 하는것이었다. 

기존에는 client의 ip에 상관없이 해당 port로 접속시도가 들어오면 무조건 connect를 하도록 되어 있었다. 


unix c Socket 통신 기본 익히기 ..

http://forum.falinux.com/zbxe/index.php?document_srl=433968&mid=C_LIB


server 및 client 소스는 컴파일하면 link 오류가 발생하여 아래 명령어로 해결했다. 

cc -w -D_REENTRANCE -g -lpthread  -lnsl -lsocket -c server.c -o server.o

cc -w -D_REENTRANCE -g -lpthread  -lnsl -lsocket server.o -o server

  or 

cc server.o -o server


cc -w -D_REENTRANCE -g -lpthread  -lnsl -lsocket -c client.c -o client.o

cc -w -D_REENTRANCE -g -lpthread  -lnsl -lsocket client.o -o client

  or 

cc client.o -o client


너무 잘 정리되어 있어서 바로 이해를 했다. 

그리고 소스 분석을 하니... 흐름을 파악할수 있었다. 

다중 쓰레드를 고려하여 만들어져 있어서 완벽히 이해하려면 더 시간이 필요했지만... 

필요한만큼 수정하고 작업에 들어갈수 있었다. 

  • hostname 으로 부터 IP얻기 
int hostname_to_ip(char * hostname , char ip[][IP_LEN_MAX])
{
    struct hostent *he;
    struct in_addr **addr_list;
    int i;

    // get the host info
    if ( (he = gethostbyname( hostname ) ) == NULL)
    {
    	CLOGFATAL("\t host lookup error!!  [%s]",hostname );
    	//CLOGINFO("\t host lookup error!!  [%s]",hostname );
        return -1;
    }

    addr_list = (struct in_addr **) he->h_addr_list;

    for(i = 0; addr_list[i] != NULL; i++)
    {
    	if( i>= IP_COUNT_MAX )  // 각 hostname당 최대 4개의 ip를 가질수 있는것을 가정하였다.
    	{
        	CLOGFATAL("\t IP Address count is over MAX(%d) for [%s]",IP_COUNT_MAX,hostname );
    	}
        strcpy(ip[i] , inet_ntoa(*addr_list[i]) );
        CLOGINFO("\t hostname : %s, ip = %s", hostname, ip[i]);
    }

    return i;
}

출처 : http://www.binarytides.com/hostname-to-ip-address-c-sockets-linux/

  • Client Reject하기 .. 
    server에서 accept를 하면 client의 ip를 알수 있는데, 여기서 유효한  ip인지를 보고, 유효하지 않으면 Reject를 하도록 하였다. Reject를 하는 방법은..  아래와 같이 accept할때 받은 FD를 사용하여 close() 하면 된다. 

    client_FD = accept(); 
    close(client_FD); 

    이렇게 하면 서버단에서 다시 socket() 생성하고 bind() 할 필요없이 계속 listen(), accept()를 하면서 유효한 client 들어올때 접속을 하면 된다. 
  • 그외...에 도움된 소스들..
  • 입출력 다중화 방식의 socket 통신이해
    http://blog.naver.com/PostView.nhn?blogId=idkhs04&logNo=40105901046


Posted by 행복한삶~!!
|