3.6 인터넷 주소 초기화 ːː tcp / ip ːː

3.6 인터넷 주소 초기화

인터넷 주소 정보를 나타내는 구조체 변수(sockaddr_in)를 선언하고 초기화해보자~

sockaddr_in : IPv4의 주소 체계를 나타내는 구조체

일반적으로는.

1: struct sockaddr_in addr; : 인터넷 주소정보나타내는 구조체 변수생성.
2: char* serv_ip = "168.188.129.231"; : ip주소 선언
3: char* serv_port = "9190"; : port 선언
4: memset(&addr, 0, sizeof(addr_len)); : 구조체 변수를 0으로 초기화 (모든 멤버를 0으로 초기화할 이유는 없지만
불필요한 데이터값을 남기는건 디버깅시 문제될 수 있으므로)
5: addr.sin_family = AF_INET; : 프로토콜 체계(protocol family) 설정
6: addr.sin_addr.s_addr = inet_addr(serv_ip); : ip주소 설정시 스트링을 네트워크바이트순서로 된 32bit ip값으로 변환.
sockaddr_in 의 멤버에는 네트워크바이트순서 대로 값을 대입해야한다.
7: addr.sin_port = htons(atoi(serv_port)); : atoi() 함수사용하여 스트링을 정수값으로 바꾸고
다시 htons 함수를 통해 네트워크바이트순서로 변환해준다.

**
위의 코드에서는 2, 3에서 ip와 port를 직접 넣어주지만 컴퓨터가 바뀔 때마다 다시 세팅해야 하기 때문에 그리 좋은 방법이 아니다.
프로그램 실행 시 main함수에 인자 값을 전달하는 방법이 좀 더 좋은 방법이다.




주소 정보 구조체를 초기화하는 형식 중 하나

1: struct sockaddr_in addr;
2: char *serv_port = "9190";
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를 할당받는(ex.라우터)경우, 어떠한 주소를 통해서 들어오는 데이터도 모두 받아들이게 된다.
따라서, 서버 프로그램을 구현하는 경우 많이 선호되는 방법이다.




공유하기 버튼

싸이월드 공감트위터페이스북
 

1 2 3 4 5 6 7 8 9 10 다음