본문 바로가기

Study/TCP/IP

인터넷 주소 초기화

1:    struct sockaddr_in addr;
2:    char *serv_ip="111.112.113.114";
3:    char *serv_port="8080"
4:    memset(&addr, 0, sizeof(addr_len));
5:    addr.sin_family = AF_INET;
6:    addr.sin_addr.s_addr = inet_addr(serv_ip);
7:    addr.sin_port = htons(atoi(serv_port));

1에서 인터넷 주소 정보를 나타내는 구조체 변수 생성.
2와 3에서는 IP 주소와 Port를 선언.
4에서는 memset 함수를 호출해서 인자로 전달되 구조체 변수를 0으로 초기화해 주고 있다. 구조체 변수의 모든 멤버를 적절한 값으로 초기화해 주는 경우 모든 멤버를 0으로 초기화 할 필요는 없으나, 불필요한 데이터를 쓰레기 값으로 남겨두는 것은 문제의 소지가 될 수 잇고, 나중에 디버깅하는데 어려움을 줄 수도 있다.
5에서 '프로토콜 체계' 설정.
6에서 IP주소를 설정해 주는데, 스트링을 네트워크 바이트 순서로 된 32비트 IP 값으로 변환해서 대입해 주고 있다. sockaddr_in의 멤버에는 네트워크 바이트 순서로 값을 대입해야 함을 잊지 말자.
7에서 atoi 함수를 사용하여 스트링을 정수 값으로 바꾸어 주고, 다시 htons 함수를 통해 네트워크 바이트 순서로 변환해 주고 있다.

위의 코드에서는 2와 3에서 IP와 Port 정보를 코드에 직접 넣어주고 있지만, 사실 이러한 방법은 좋은 방법이 아니다. 이렇게 구현하게 되면 다른 컴퓨터에서 실행 할 때 마다 코드를 변경해 주고 나서 다시 컴파일해야 하기 때문이다.

프로그램 실행 시 main 함수에 인자 값을 전달하는 방법이 이보다는 좋은 방법이다.

1:   struct sockaddr_in addr;
2:   char *serv_port = "8080";
3:   memset(&addr, 0, sizeof(addr_len));
4:   addr.sin_family = AF_INET;
5:   addr.sin_addr.s_addr = htonl(INADDR_ANY);
6:   addr.sin_port = htons(atoi(serv_port));

조금전의 방법과 가장 큰 차이점은 INADDR_ANY 상수를 통해서 주소를 할당하고 있다는 것이다. 이러한 초기화 방법을 사용할 경우 현재 시스템의 IP 주소를 자동적으로 찾아서 할당해 주기 때문에 시스템의 IP 주소를 찾는 수고를 덜 수 있다.

뿐만 아니라, 만약에 시스템 내에 두 개 이상의 IP를 할당받아서 사용하는 경우(MultiHomed 컴퓨터라 하며 일반적으로 라우터가 이에 해당한다.) 어떠한 주소를 통해서 들어오는 데이터도 모두 받아 들이게 된다. 따라서 서버 프로그램을 구현하는 경우에 많이 선호되는 방법이다.

'Study > TCP/IP' 카테고리의 다른 글

인터넷 주소 조작하기  (0) 2008.02.16
네트워크 바이트 순서  (0) 2008.02.16
주소 정보의 표현  (0) 2008.02.16
Port란,  (0) 2008.02.16
Internet Address  (0) 2008.02.16