● 인터넷주소 ●
- 인터넷상에서 컴퓨터를 구분하는 목적으로 사용되는 주소
- IPv4 인터넷 주소와 체계(4바이트) IPv6 주소 체계(16바이트)가 있음
- 주소체계에따라 4가지 클래스가있음
- 주소체계는 네트워크주소와 호스트주소로나뉨
(네트워크주소를 이용해서 네트워크를찾고, 호스트주소를 이용해 호스트를 찾음)
A클래스 - 1바이트(네트워크ID) 3바이트(호스트ID) 0이상 127이하 - 첫번째비트는 0으로 시작
B클래스 - 2바이트(네트워크ID) 2바이트(호스트ID) 128이상 191이하 - 첫번째비트는 10으로 시작
C클래스 - 3바이트(네트워크ID) 1바이트(호스트ID) 192이상 223이하 - 첫번째비트는 110으로 시작
D클래스 - 4바이트(멀티케스트 IP주소)
● PORT ●
- 소켓을 구분하는 용도
- 하나의 커퓨터에 두개이상의 포트 존재가능
- PORT번호는 16비트로 표현(0~65535)
- 0~1023은 잘알려진 PORT(Well-Known PORT)로 이미 용도가 결정되어 있음
● 구조체설명 ●
struct sockaadr_in
{
sa_family_t sin_family; //주소체계(ipv4-AF_INET,ipv6-AF_INET6,로컬통신을위한 유닉스 프로토콜의 주소체계-AF_LOCAL)
uint16_t sin_port; //PORT번호
struct in_addr sin_addr; //32비트IP주소(사실상32비트정수)
char sin_zero[8]; //사용x - 반드시0
};
sturct in_addr
{
in_addr_t s_addr; //32비트 주소
};
struct sockaadr
{
sa_family_t sin_family; //주소체계
char sa_data[14]; //사용정보
};
---설명-------------
- 결론적으로는 sockaadr구조체를 채워야하는데 ip와 port를 해당구조체에 채우기가 쉽지 않아
편의성을 위해 sockaadr_in 구조체를 만들어 채우고 struct sockaadr으로 형변환을해 함수호출시 사용한다.
- in_addr 구조체는 사실상 4바이트 정수형
--------------------
---사용예-----------
struct sockaddr_in serv_addr;
// 구조체 채우고
if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1)
--------------------
cf) (struct sockaddr*) 형변환 필요
● 바이트순서 ●
- 빅엔디안
0x12345678저장 시
0x20 0x21 0x22 0x23
0x12 0x34 0x56 0x78
- 리틀엔디안
0x12345678저장 시
0x20 0x21 0x22 0x23
0x78 0x56 0x34 0x12
- 호스트바이트순서
CPU별데이터 저장방식을 의미함
- 네트워크바이트순서
통일된 데이터 송수신기준을 의미함
빅엔디안이 기준
- 바이트변환함수
unsigned short htons(unsigned short); // 호스트를 네트워크바이트순서로 (shor -> 포트변환)
unsigned short ntohs(unsigned short); // 네트워크바이트를 호스트순서로 (shor -> 포트변환)
unsigned long htons(unsigned long); // 호스트를 네트워크바이트순서로 (long -> 주소변환)
unsigned long ntohs(unsigned long); // 네트워크바이트를 호스트순서로 (long -> 주소변환)
●문자열 네트워크바이트주소 변환 관련함수●
1. inet_addr
- 함수원형
in_addr_t inet_addr(const char * string);
- 설명 :
주소(문자열)를 네트워크바이트순서의 정수로 반환
- 반환 :
성공시 빅엔디안으로 변환된 32비트 정수값
실패시 IANDDR_NONE 반환
- 인자 : 문자열 주소값(예_192.168.0.15)
2. inet_aton
- 함수원형
int inet_aton(const char * string, struct in_addr *addr);
- 설명 :
주소(문자열)를 in_addr 구조체에 채움
- 반환 :
성공 시 1 ,실패 시 0
- 인자
string : 문자열 주소값(예_192.168.0.15)
addr : 변환정보를 저장할 in_addr 구조체변수에 채움
3. inet_ntoa
- 함수원형
char * inet_ntoa(struct in_addr adr);
- 설명 :
구조체 in_addr의 주소정보를 문자열형태의 주소로 반환
- 반환 :
성공시 변환된 문자열의 주소 값 실패시 -1
- 인자 : in_addr구조체의 주소정보
●INADDR_ANY ●
- 설명
현재 실행중인 컴퓨터의 주소 및 포트정보로 설정
즉.자기자신의 주소와 포트정보로 설정
예)
struct sockaddr_in addr;
char *serv_port="9190";
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr.sin_port=htons(atoi(serv_port));
'프로그래밍' 카테고리의 다른 글
5_TCP이론 (0) | 2018.01.09 |
---|---|
4_listen,accept,connect,iterative서버 (0) | 2018.01.08 |
2_socket 함수인자 (0) | 2017.12.18 |
1_소켓프로그래밍의 주요함수 (0) | 2017.12.12 |
윈도우시스템프로그래밍_03.32비트 64비트 구조 및 차이 (0) | 2017.03.22 |
댓글