[KERNEL] struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4; #elif defined (__BIG_ENDIAN_BITFIELD) __u8 version:4, ihl:4; #else #error "Please fix " #endif __u8 tos; __u16 tot_len; __u16 id; __u16 frag_off; __u8 ttl; __u8 protocol; __u16 check; __u32 saddr; __u32 daddr; /*The options start here. */ }; /* XXX: RFC2292bis */ struct ipv6hdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 tclass1:4, version:4; #elif defined(__BIG_ENDIAN_BITFIELD) __u8 version:4, tclass1:4; #else #error "Please fix " #endif __u8 tclass2_flow[3]; __u16 payload_len; __u8 nexthdr; __u8 hop_limit; struct in6_addr saddr; struct in6_addr daddr; }; [void * のかわり] struct sockaddr { uin8_t sa_len; /* linux で見あたらず。*/ unsigned short sa_family; /* アドレスファミリ*/ char sa_data[MAXSOCKADDRDATA]; }; [UNIX] struct sockaddr_un { unsigned short sun_family; cahr sun_path[UNIX_PATH_MAX]; }; [IPv4] struct in_addr { in_addr_t s_addr; /* IPv4 address (network byte order)*/ }; struct sockaddr_in { uint8_t sin_len; /* 構造体の大きさ(16バイト) linux で見あたらず。*/ sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* 16ビット */ struct in_addr sin_addr; /* IPv4 address (network byte order)*/ char sin_zero[8]; /* 未使用 */ }; [IPv6] struct in6_addr { uint8_t s6_addr[16]; // IPv6 address }; struct sockaddr_in6 { uint8_t sin6_len; // length of this struct sa_family_t sin6_family; // AF_INET6 in_port_t sin6_port; // port number uint32_t sin6_flowinfo; // IPv6 flow infomation struct in6_addr sin6_addr; // IPv6 address uint32_t sin6_scope_id; // scope id }; [HOST] struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; }; hostent{} +-------------+ | h_name ------->"公式ホスト名" +-------------+ | h_aliases ---------------->+-------------+ +-------------+ | --------> "エイリアス#1" | h_addrtype |AF_INET[6] +-------------+ +-------------+ = = | h_length |4/16 +-------------+ +-------------+ | NULL | | h_addr_list -------+ +-------------+ +-------------+ | | +------>+-------------+ | --------> in[6]_addr{} +-------------+ = = +-------------+ | NULL | +-------------+ [ワイルドカードアドレス] に "INADDR_*" で存在。 [Multi Cast] struct ip_mreq { struct in_addr imr_multiaddr; /* IPv4 class D multi cast address */ struct in_addr imr_interface; /* IPv4 address of local interface */ }; struct ipv6_mreq { struct in6_addr ipv6mr_multiaddr; /* IPv6 multi cast address */ unsigned int ipv6mr_interface; /* interface index ofr 0 */ }; ------------------------------------------------------------------------------- (TCP Server) (TCP Client) (UDP Server) (UDP Client) +-----------+ +-----------+ +-----------+ +-----------+ | socket(2) | | socket(2) | | socket(2) | | socket(2) | +-----------+ +-----------+ +-----------+ +-----------+ || || || || ||sockaddr_in || sockaddr_in || || \/ \/ \/ || +-----------+ +-----------+ +-----------+ || | bind(2) | | connect(2)| | bind(2) | || +-----------+ +-----------+ +-----------+ || || || || || || || || || \/ || \/ \/ +-----------+ || +------------+ +-------------+ | listen(2) | || | recvfrom(2)|<==>| sendto(2) | +-----------+ || | /sendto(2) | | /recvfrom(2)| || || +------------+ +-------------+ || || || || \/ || || || +-----------+ || \/ \/ | accept(2) | || +-----------+ +----------+ +-----------+ || | close (2) | | close(2) | || || +-----------+ +----------+ || || \/ \/ +-----------+ +-----------+ | read(2) |<==>| write(2) | | /write(2)| | /read(2) | +-----------+ +-----------+ || || || || \/ \/ +-----------+ +-----------+ | close(2) | | close(2) | +-----------+ +-----------+