반응형

- SOCKADDR_IN 구조체 멤버에 IP주소 정보를 저장하기 위해서는 32bit 정수형으로 할당

- IP주소를 표현할 때 문자열로 표현된 '점이 찍힌 십진수 표현 방식' (211.214.107.99)을 32bit로 변환해주는 함수

: unsigned long inet_addr(const char* cp);

: in_addr_t inet_addr(const char*string);

→ 성공 시 big endian(네트퉈크 바이트 순서)으로 변환된 32bit 정수 값, 실패 시 INADDR_NONE 반환

 

int inet_aton(const char* string, struct in_addr* addr);

→ 성공 시 1, 실패 시 0 반환

 

- 네트워크 바이트 순서로 정렬된 정수형 IP주소 정보를 문자열형으로 변환

- 내부적으로 메모리공간을 할당하여 문자열의 주소 값을 반환하므로 inet_ntoa함수가 호출되어 반환된 문자열 정보가 바뀌지 않도록 문자열 정보를 다른 메모리 공간에 복사해야 함

: char* inet_ntoa(struct iin_addr adr);

→ 성공 시 변환된 문자열읭 주소 값, 실패 시 -1 반환

 

  • 서버 프로그램의 인터넷 주소정보 초기화: IP정보, PORT번호를 통해 들어오는 데이터는 내게로 다 보내라
  • SOCKADDR_IN 구조체 변수에 서버 socket이 동작하는 컴퓨터 IP, socket에 부여할 PORT번호로 초기화하고 bind함수 호출
  • INADDR_ANY 상수를 통해 IP정보 할당 
  • 서버 socket에서도 IP할당이 필요한 이유? : IP주소는 컴퓨터의 NIC의 개수만큼 부여가 가능하므로 서버 socket에서 어느 IP 주소로 들어오는 데이터를 수신할지 결정이 필요 
  • 클라이언트 프로그램의 인터넷 주소정보 초기화: IP정보, PORT번호로 연결을 해라
  • SOCKADDR_IN구조체 변수에 연결할 서버 socket의 IP, PORT번호로 초기화하고 connect함수 호출

 

- INADDR_ANY

: socket이 동작하는 컴퓨터의 IP주소가 자동으로 할당
: 라우터처럼 컴퓨터 내에 두 개 이상의 IP를 할당받아 사용하는 경우(nulti-homed 컴퓨터) 할당 받은 IP 중 주소가 일치하는 것이 있으면 송수신 가능

 

[Linux 기반 서버 socket 프로그램 실행]

ex) ./hserver 9190

- 9190: PORT번호

- socket의 IP주소는 INADDR_ANY를 통한 IP주소의 초기화

구조체 SOCKADDR_IN의 변수 초기화

초기화된 주소 정보를 bind 함수를 이용하여 socket에 할당

 

 

[Linux 기반 클라이언트 socket 프로그램 실행]

ex) ./hclient 127.0.0.1 9190

- 127.0.0.1: loopback address로 컴퓨터 자신의 IP주소

 

  • winsock2 에서 추가된 변환함수

- inet_addr, inet_ntoa와 기능을 동일

- IPv4, IPv6 프로토콜 체계에 적용이 가능

- inet_addr, inet_ntoa 함수는 Linux에서 window, window에서 Linux로 호환 가능하지만 winsock2에 추가된 변환함수를 사용할 경우 window에만 종속된 코드가 만들어지므로 다른 프로그램으로의 이식성이 떨어짐

 

  • WSAStringToAddress: 주소정보를 나타내는 문자열으 ㄹ가지고 주소정보 구조체 변수에 채워 넣을 때 호출

INT WSAAPI WSAStringToAddressA(
  [in]           LPSTR               AddressString,                          // IP, PORT 번호를 담고 있는 문자열의 주소값 전달
  [in]           INT                 AddressFamily,                           // 첫 번째 인자의 주소정보가 속하는 주소체계 정보
  [in, optional] LPWSAPROTOCOL_INFOA lpProtocolInfo,            // 프로토콜 프로바이더 설정, 일반적으로 null 전달
  [out]          LPSOCKADDR          lpAddress,                         // 주소정보를 담을 구조체 변수의 주소값 전달
  [in, out]      LPINT               lpAddressLength              // 주소정보 구조체 변수의 크기를 담고 있는 변수의 주소값
);

 

  • WSAAddressToString: 구조체 변수에 저장된 데이터를 참조하여 조소정보를 담고 있는 문자열 반환

INT WSAAPI WSAAddressToStringA(
  [in]           LPSOCKADDR          lpsaAddress,                 // 문자열로 변환할 주소정보 구조체 변수의 주소값
  [in]           DWORD               dwAddressLength,            // 주소정보 구조체 변수의 크기
  [in, optional] LPWSAPROTOCOL_INFOA lpProtocolInfo,      // 프로토콜 바이더 설정, 일반적으로 null 전달
  [in, out]      LPSTR               lpszAddressString,              // 문자열로 변환된 결과를 저장할 배열의 주소값
  [in, out]      LPDWORD             lpdwAddressStringLength  // 네번째 인자의 배열 크기를 담는 변수의 주소값
);

 

반응형

+ Recent posts