티스토리 뷰
sockaddr_in에 주소정보를 저장하려면 선언된 멤버는 32비트 정수형이어야 한다.
따라서 32비트 형태로 IP주소를 표현하기위해 사용되는 함수가 inet_addr([변환할 IP주소]) 이다.
inet_addr(const char * string)
- 문자열로 표현된 IP주소를 32비트 정수형으로 변환해주는 함수
- 변환과정에서 네트워크 바이트 순서로의 변환, 정렬도 동시진행
- 유효하지 못한 IP주소에 대한 오류검출 수행
- 변환된 IP주소정보를 구조체 sockaddr_in의 in_addr변수에 추가로 대입해주어야 함.
마찬가지로 유사한 역할을 하는 함수가 하나 더 있다. inet_aton([변환할 IP주소], [in_addr 구조체 변수의 주소값])
inet_aton(const char * string, struct in_addr * addr)
- inet_addr과 기능 유사, inet_addr보다 더 많이쓰인다
- 다만 매개변수로 구조체 sockaddr_in의 in_addr변수의 주소를 넘기기때문에 추가대입이 필요없다.
반대로 네트워크 바이트 순서로 정렬된 정수형 IP주소정보를 문자열의 형태로 변환해주는 함수
inet_ntoa(struct in_addr adr)
- 인자로 받아온 정수형태의 IP정보를 문자열형태의 IP정보로 변환 후, 변환된 문자열의 주소값을 반환
- 즉, 반환형이 char포인터형 이다.
- 다시말해 이 함수를 호출시 함수 내부적으로 메모리공간을 할당하여 문자열정보를 저장하므로
- 재 호출 직전에 기존정보를 따로 변수에 담아두어 정보손실을 주의해야한다.
서버 : sockaddr_in구조체 변수에 서버소켓이 동작하는 컴퓨터의 IP, PORT번호로 초기화 한 다음 bind() 호출
클라이언트 : sockaddr_in 구조체 변수에 연결할 서버소켓의 IP, PORT번호로 초기화 한 다음 connect() 호출
sin_addr.s_addr = htonl(INADDR_ANY)
- 소켓이 동작하는 컴퓨터의 IP주소가 자동으로 할당
- 할당받은 IP중 어떤 주소를 통해서 데이터가 들어오더라도, PORT번호만 일치하면 수신가능
- 서버프로그램 구현에 많이 선호되는 방식
# 네트워크 바이트순서로 변환된 값의 예제
# 실행결과
# inet_addr, inet_ntoa 사용 예제
'NETWORK' 카테고리의 다른 글
4) TCP 서버 함수호출 순서 및 함수분석 (0) | 2018.04.24 |
---|---|
3) TCP / UDP에 대한 이해 (0) | 2018.04.24 |
1) 소켓멤버분석 : sockaddr_in구조체 (0) | 2018.04.19 |