Chapter 3 Sockets Introduction By They Yu Shu
Outline Socket Address Structures Value-Result Arguments Byte Ordering Functions Byte Manipulation Functions Address Conversion
Socket Address Structure In socket programming, IP address and Port value are used to identify the end-points of the TCP/IP communication. Socket Address Structure is a data structure to hold Address Family IP address Port Value And ….
IPv4 Socket Address Structure struct in_addr { in_addr_t s_addr; /* 32-bit IPv4 address */ /* network byte ordered */ }; struct sockaddr_in { uint8_t sin_len; /* length of structure */ sa_family_t sin_family; /* 16 bit address family*/ /*AF_INET*/ in_port_t sin_port; /* 16-bit TCP or UDP port number */ struct in_addr sin_addr; /* 32-bit IPv4 address */ char sin_zero[8]; /* unused (to keep sockaddr_in > 16 bytes in size) */
Address Family Number Number Description Reference ------ ---------------------------------------------------- --------- 0 Reserved 1 IP (IP version 4) 2 IP6 (IP version 6) 3 NSAP 4 HDLC (8-bit multidrop) 5 BBN 1822 6 802 (includes all 802 media plus Ethernet "canonical format") 7 E.163 8 E.164 (SMDS, Frame Relay, ATM) 9 F.69 (Telex) 10 X.121 (X.25, Frame Relay) 11 IPX 12 Appletalk 13 Decnet IV 14 Banyan Vines 15 E.164 with NSAP format subaddress [UNI-3.1] [Malis] 16 DNS (Domain Name System) 17 Distinguished Name [Lynn] 18 AS Number [Lynn] 19 XTP over IP version 4 [Saul] 20 XTP over IP version 6 [Saul] 21 XTP native mode XTP [Saul] 22 Fibre Channel World-Wide Port Name [Bakke] 23 Fibre Channel World-Wide Node Name [Bakke] 24 GWID [Hegde] 25 AFI for L2VPN information [RFC4761] 65535 Reserved
Socket Functions IPv4 Socket Address Structure IPv6 Socket others Socket Address Structure Socket Functions: Bind() Connect() Send() Recv() …. Example: int bind(int, struct sockaddr *, socklen_t );
Generic Socket Address Structure struct sockaddr { uint8_t sa_len; sa_family_t sa_family; /* address family: AF_xxx value */ char sa_data[14]; /* protocol-specific address */ };
Using Generic Socket Address Structure struct sockaddr_in serv; /* IPv4 socket address structure */ /* fill in serv{} */ bind(sockfd, (struct sockaddr *) &serv, sizeof(serv));
IPv6 Socket Address Structure struct in6_addr { uint8_t s6_addr[16]; /* 128-bit IPv6 address */ /* network byte ordered */ }; struct sockaddr_in6 { uint8_t sin6_len; /* length of this struct (28) */ sa_family_t sin6_family; /* AF_INET6 */ in_port_t sin6_port; /* transport layer port# */ uint32_t sin6_flowinfo; /* flow information, undefined */ struct in6_addr sin6_addr; /* IPv6 address */ uint32_t sin6_scope_id; /* set of interfaces for a scope */
New Generic Socket Address Structure struct sockaddr_storage { uint8_t ss_len; /* length of this struct (implementation dependent) */ sa_family_t ss_family; /* address family: AF_xxx value */ ….. };
Value-Result Arguments Arguments used for both value passing and result returning purpose. Process to Kernel: bind(),connect(),sendto() Example: struct sockaddr_in serv; /* fill in serv{} */ connect (sockfd, (sockaddr *) &serv, sizeof(serv) ); Kernel to Process accept(), recvfrom(), getsockname(), and getpeername() struct sockaddr_un cli; /* Unix domain */ socklen_t len; len = sizeof(cli); /* len is a value */ getpeername(unixfd, (sockaddr *) &cli, &len); /* len may have changed */
Byte Ordering Functions
#include <netinet/in.h> uint16_t htons(uint16_t host16bitvalue) ; uint32_t htonl(uint32_t host32bitvalue) uint16_t ntohs(uint16_t net16bitvalue) ; uint32_t ntohl(uint32_t net32bitvalue) ;
Byte Manipulation Functions
Address Conversion Functions to convert 32 bit IPv4 network address to Ascii string 0x01020304 => “1.2.3.4” inet_aton(), net_ntoa()
Address Conversion Functions to convert 32 bit IPv4/IPv6 network address to Ascii string inet_pton(), inet_ntop()
End