- 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 // 네번째 인자의 배열 크기를 담는 변수의 주소값
);
'프로그래밍의 기초 > TCP | IP' 카테고리의 다른 글
TCP 기반 서버, 클라이언트 구현 (0) | 2022.01.10 |
---|---|
TCP와 UDP에 대한 이해 (0) | 2022.01.07 |
네트워크 바이트 순서 (0) | 2022.01.06 |
주소 정보의 표현 (0) | 2022.01.06 |
socket에 할당하는 IP주소와 PORT번호 (0) | 2022.01.06 |