[IPv4의 주소 체계를 나타내는 구조체]
struct sockaddr_in
{
sa_family_t sin_family; // 주소 체계
uint16_t sin_port; // 16비트 TCP / UDP Port
struct in_addr sin_addr; // 32비트 IPv4 주소
char size_zero[8]; // 사용되지 않음
};
struct in_addr
{
uint32_t s_addr; // 32비트 IPv4 인터넷 주소
};
[POSIX(Potable Operating System Interface)]
Data type | Description | Header |
---|---|---|
int8_t uint8_t int16_t uint16_t int32_t uint32_t | signed 8-bit int unsigned 8-bit int (unsigned char) signed 16-bit int unsigned 16-bit int (unsigned short) signed 32-bit int unsigned 32-bit int (unsigned long) | <sys/types.h> |
sa_family_t socklen_t | address family length of struct | <sys/socket.h> |
[Local Unix 프로토콜에서 사용되는 주소 정보 구조체]
struct sockaddr_un
{
sa_family_t sun_family; // 주소 체계
char sun_path[108]; // 경로 이름
}
[sockaddr_in 구조체 정보]
사용되는 주소 체계에 대한 정보 대입(프로토콜 체계마다 주소 체계가 다름)
주소 체계 | 정의 |
---|---|
AF_INET | IPv4 인터넷 프로토콜 |
AF_INET6 | IPv6 인터넷 프로토콜 |
AF_LOCAL | Local 통신을 위한 UNIX 프로토콜 |
[바이트 순서 변환 함수]
#include <netinet/in.h>
unsigned short htons(unsigned short);
unsigned short ntohs(unsigned short);
unsigned long htonl(unsigned short);
unsigned long ntohl(unsigned short);
// h : host byte order
// n : network byte order
// s : short (16bit)
// l : long (32bit)
htonl은 Host Byte 순서를 Network Byte 순서로 바꾸는 함수를 의미
뒤의 l은 long 타입을 의미
→ 32비트 데이터를 호스트 바이트 순서에서 네트워트 바이트 순서로 바꾸어 주는 함수
#include <stdio.h>
int main(int argc, char** argv)
{
short host_port_order = 0x1234;
short net_port_order;
long host_add_order = 0x12345678;
long net_add_order;
net_port_order = htons(host_port_order);
net_add_order = htonl(host_add_order);
printf(" Host ordered port : %x \n", host_port_order);
printf(" Network ordered port : %x \n\n", net_port_order);
printf(" Host ordered Address : %x \n", host_add_order);
printf(" Network ordered Address : %x \n\n", net_add_order);
return 0;
}
자신이 쓰고 있는 시스템이 Big-Endian 방식을 쓰고 있다 하더라도 반드시 변환 함수를 사용해서 네트워크 바이트 순서로 변환하는 과정을 거쳐야함
→ 이식성을 좋게 하기 위해
[결과]
네트워크 바이트 순서로 변환해서 출력한 결과, 호스트 바이트 순서의 출력 결과와 반대임 → Little-Endian 방식을 쓰고 있음