본문 바로가기
프로그래밍

3_bin함수

by BlueOcean&Shark 2017. 12. 29.

● 인터넷주소 ●
- 인터넷상에서 컴퓨터를 구분하는 목적으로 사용되는 주소
- 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));

 

 

 

댓글