Socket 주소 구조는?
SUBJECT: Socket 주소 구조는?
Description :
######## 소켓 주소 구조 ##########
많은 BSD network 시스템 호출은 독립변수로서 소켓주소 구조의 지시자를
필요로 한다. 이 구조의 정의는 에 있다.
struct sockaddr {
u_short sa_family; /* address family: AF_XXX value */
char sa_data[14]; /* up to 14 bytes of protocol-specific address */
1 Internet family(가족)에 대하여 다음구조 에
정의되어 있다.
struct in_addr {
u_long s_addr /* 32-bit netid/hostid */
};
struct sockaddr_in {
short sin_family; /* AF_INET */
u_short sin_port; /* 16-bit port number */
struct in_addr sin_addr; /* 32-bit netid/hostid */
char sin_zero[8]; /* unused, padding to 16 bytes */
};
♨ 에 정의된 무부호 데이타 형
--------------------------------------------
C Data Type 4.3 BSD System V
--------------------------------------------
unsigned char u_char unchar
unsigned short u_short ushort
unsigned int u_int uint
unsigned long u_long ulong
--------------------------------------------
2 Xerox NS 가족에 대하여 다음과 같은 구조 에 정의되어 있다.
union ns_host {
u_char c_host[6] /* hostid addr as six bytes */
u_short s_host[3] /* hostid addr as three 16-bit shorts */
}
union ns_net {
u_char c_net[4] /* netid as four bytes */
u_short s_net[2] /* netid as two 16-bit shorts */
}
struct ns_addr {
union ns_net x_net; /* 4-byte netid */
union ns_host x_host; /* 6-byte hostid */
u_short x_port; /* 2-byte port (XNS "socket") */
};
struct sockaddr_ns {
u_short sns_family; /* AF_NS */
struct ns_addr sns_addr; /* the 12-byte XNS address */
char sns_zeor[2]; /* unused */
};
#define sns_port sns_addr.x_port
3 유닉스 범주에 대하여 다음구조는 에 정의되어 있다.
struct sockaddr_un {
short sun_family; /* AF_UNIX */
char sun_path[108]; /* pathname */
};
☆ XX_family 구성원인 이들 주소 구조중 처음 두 바이트의 선언이 일치하지 않는다.
Internet과 유닉스범주 구성원들은 짧은 정수로 선언되어 있는 반면,
XNS 구성원과 일반적인 sockaddr구성원은 무부호 짧은 정수이다.
다행스럽게도 AF_XXX 상수들에 저장되는 값들은 모두 1과 20사이이므로
데이타 형에 있어서 이러한 불일치는 문제가 되지 않는다.
◆ Internet, XNS, Unix 가족에 대한 소켓주소 구조 ◆
struct sockaddr_in struct sockaddr_ns struct sockaddr_un
------------------ ------------------ -------------------
| family | | family | | family |
------------------ ------------------ -------------------
| 2-byte port | | 4-byte net ID | | |
------------------ ------------------ | |
| 4-byte | | | | |
| net ID,host ID | | | | pathname |
------------------ | 6-byte host ID | |(up to 108 bytes)|
| | | | | |
| | | | | |
| (unused) | ------------------ | |
| | | 2-byte port | | |
| | ------------------ | |
| | | (unused) | | |
------------------ ------------------ -------------------
☞ Address family 는 에 정의되있음
#define AF_UNIX 1 /* local to host (pipes, portals) */
#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
#define AF_NS 6 /* XEROX NS protocols */
☞ 소켓 접속의 설계자는 소켓 주소 구조를 정의하기 위해서 C의 union을
사용할 수도 있다. 그 선언은 다음과 같이 작성할 수 있다.
struct sock_addr {
short sa_family; /* AF_XXX value */
union {
struct sockaddr_in sa_in; /* Internet address */
struct sockaddr_ns sa_ns; /* XNS address */
struct sockaddr_un sa_un; /* Unix address */
} sa_val;
};
이러한 접근방법의 문제는 union의 크기가 유닉스 범주 주소 크기인 가장 큰
구성원의 크기에 의하여 결정된다는 것이다. 이는 Internet과 XNS주소가 각각
8바이트와 14바이트만 필요로 할지라도 모든 sock_addr 구조의 크기를
110바이트가 되게 한다 (이 경우에 Internet sockadd_in의 마지막 부분에
0으로 구성된 8바이트와 XNS sockaddr_ns의 마지막 부분에 0으로 구성된
2바이트가 필요없다는 사실에 주의)
Revision History
작성일자 : 96.10.11
작성자 : 이진수
수정일자 :
수정자 :