chapter 03. socket address structures
DESCRIPTION
Chapter 03. Socket Address Structures. Goal. Socket address structures Byte ordering IP address conversion Domain name conversion. Def. of socket address structures (1/6). Socket address structures Sockets use the socket address structure to pass and to receive addresses - PowerPoint PPT PresentationTRANSCRIPT
Chapter 03.
Socket Address Structures
IT COOKBOOKIT COOKBOOK
- 2 -
Goal
• Socket address structures• Byte ordering• IP address conversion• Domain name conversion
IT COOKBOOKIT COOKBOOK
- 3 -
Def. of socket address structures (1/6)
• Socket address structures– Sockets use the socket address structure to
pass and to receive addresses – Several types depending on address family
• example) TCP/IP SOCKADDR_IN, IrDA SOCKADDR_IRDA
– Basic type is SOCKADDR structure
IT COOKBOOKIT COOKBOOK
- 4 -
Def. of socket address structures (2/6)
• SOCKADDR structure
– sa_family• 16-bit integer value identifying the protocol family being used
e.g.) TCP/IP AF_INET
– sa_data• Address information used in the protocol family
e.g.) TCP/IP IP address and port number
struct sockaddr { u_short sa_family; char sa_data[14];};
typedef struct sockaddr SOCKADDR;
IT COOKBOOKIT COOKBOOK
- 5 -
Def. of socket address structures (3/6)
• SOCKADDR_IN structure
– sin_addr• 32-bit in_addr structure
struct sockaddr_in { short sin_family; // AF_INET u_short sin_port; // port number struct in_addr sin_addr; // IP address char sin_zero[8]; // always 0};
typedef struct sockaddr_in SOCKADDR_IN;
IT COOKBOOKIT COOKBOOK
- 6 -
Def. of socket address structures (4/6)
• IN_ADDR structure
struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un;#define s_addr S_un.S_addr};
typedef struct in_addr IN_ADDR;
IT COOKBOOKIT COOKBOOK
- 7 -
Def. of socket address structures (5/6)
• comparison of socket address structures
sa_family(2)
sa_data(14)
sin_family(2)
sin_port(2)
sin_addr(4)
sin_zero(8)
irdaAddressFamily(2)
irdaDeviceID(4)
irdaServiceName(25)
SOCKADDR{} SOCKADDR_IN{} SOCKADDR_IRDA{}
IT COOKBOOKIT COOKBOOK
- 8 -
Def. of socket address structures (6/6)
• Use of socket address structure– example1)
– Example 2)
SOCKADDR_IN addr1;// initialize socket address structure...
f((SOCKADDR *)&addr1, ...);
SOCKADDR_IN addr2;g((SOCKADDR *)&addr2, ...);
// use socket address structure...
IT COOKBOOKIT COOKBOOK
- 9 -
Byte ordering function calls (1/6)
• byte ordering– Two ways to store data in their memories
• big-endian: the high-order octet is stored in the lowest memory location
• little-endian: the high-order octet is stored in the highest memory location
0x12 0x34 0x56 0x78
0x78 0x56 0x34 0x12
Big-endian
Little-endian
0x1000 0x1001 0x1002 0x1003
IT COOKBOOKIT COOKBOOK
- 10 -
Byte ordering function calls (2/6)
• What if byte ordering is not considered in the below?
End system router End systemrouter
data
IP addressPort number
??
?
(a)
(b)
(c)
IT COOKBOOKIT COOKBOOK
- 11 -
Byte ordering function calls (3/6)
• Cases that byte ordering must be considered in network applications– Address information for protocol
• (a) IP address big-endian• (b) port number big-endian
– Data that applications send and receive • (c) big-endian or little-endian
network byte ordering
: big-endian host byte ordering
: byte ordering that system uses
Ref.
IT COOKBOOKIT COOKBOOK
- 12 -
Byte ordering function calls (4/6)
• Byte ordering functions(unix compatible)
• Byte ordering functions(Winsock extended)
u_short htons (u_short hostshort); // host-to-network-shortu_long htonl (u_long hostlong); // host-to-network-longu_short ntohs (u_short netshort); // network-to-host-shortu_long ntohl (u_long netlong); // network-to-host-long
int WSAHtons (SOCKET s, u_short hostshort, u_short* lpnetshort);int WSAHtonl (SOCKET s, u_long hostlong, u_long* lpnetlong);int WSANtohs (SOCKET s, u_short netshort, u_short* lphostshort);int WSANtohl (SOCKET s, u_long netlong, u_long* lphostlong);
IT COOKBOOKIT COOKBOOK
- 13 -
Byte ordering function calls (5/6)
• Use of byte ordering functions
Socket system call
hton*( )
Data to pass
Socket system call
ntoh*( )
Use data in application
Data from socket call
IT COOKBOOKIT COOKBOOK
- 14 -
Byte ordering function calls (6/6)
• Byte ordering of SOCKADDR_IN structure
sin_family(2)
sin_port(2)
sin_addr(4)
sin_zero(8)
SOCKADDR_IN{}
Host byte ordering
Network byte ordering
IT COOKBOOKIT COOKBOOK
- 15 -
Byte ordering function calls (6/6)
• ByteOrder.cpp
IT COOKBOOKIT COOKBOOK
- 16 -
Function calls to convert IP address (1/4)
• Example.
IT COOKBOOKIT COOKBOOK
- 17 -
Function calls to convert IP address(2/4)
• IP address coversion function calls
– Converts an IP address in ASCII dotted-decimal format to 32-bit binary format (network byte ordering)
– Converts 32-bit binary format (network byte ordering) to an IP address in ASCII dotted-decimal format
unsigned long inet_addr (const char* cp);
char* inet_ntoa (struct in_addr in); // network-to-ascii
IT COOKBOOKIT COOKBOOK
- 18 -
Function calls to convert IP address(3/4)
• Use ① of byte ordering and IP address conversion function calls– Case that address information is passed to socket system
call after socket address structure initialization (usually sender side)
• f( ) is socket system call
// initialize socket address structureSOCKADDR_IN addr;ZeroMemory(&addr, sizeof(addr)); // initialize to 0addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr("147.46.114.70");addr.sin_port = htons(9010);
// socket system callf((SOCKADDR *)&addr, ...);
IT COOKBOOKIT COOKBOOK
- 19 -
Function calls to convert IP address (4/4)
• Use ② of byte ordering and IP address conversion function calls– Case that application prints address information after socket
system call (usually receiver side)• g( ) is socket system call
// declaration of socket address structureSOCKADDR_IN addr;
// socket system callg((SOCKADDR *)&addr, ...);
// print IP address and port numberprintf("IP address=%s, port number=%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
IT COOKBOOKIT COOKBOOK
- 20 -
Byte ordering function calls (6/6)
• IPAddr.cpp
IT COOKBOOKIT COOKBOOK
- 21 -
coversion between domain name and IP address (1/6)
• Example: Domain name IP address
IT COOKBOOKIT COOKBOOK
- 22 -
coversion between domain name and IP address (2/6)
• Domain name IP address
/* domain name IP address(network byte ordering) */struct hostent* gethostbyname ( const char* name // domain name);
/* address(network byte ordering) domain name */struct hostent* gethostbyaddr ( const char* addr, // network byte ordered IP address int len, // length of IP address(e.g.: 4) int type // address family(e.g.: AF_INET));
IT COOKBOOKIT COOKBOOK
- 23 -
coversion between domain name and IP address(3/6)
• hostent struct
struct hostent { char * h_name; // official name of host char ** h_aliases; // alias list short h_addrtype; // host address type short h_length; // length of address char ** h_addr_list; // list of addresses#define h_addr h_addr_list[0] // address, for backward compatibility};
typedef struct hostent HOSTENT;
IT COOKBOOKIT COOKBOOK
- 24 -
coversion between domain name and IP address(4/6)
• hostent struct (cont’d)
AF_INET
4
official domain name\0
alias #1\0
alias #2\0
NULL
h_name
h_aliases
h_addrtype
h_length
h_addr_list
HOSTENT{}
IP address #1
IP address #2
NULL
IN_ADDR{}
h_length = 4
IT COOKBOOKIT COOKBOOK
- 25 -
coversion between domain name and IP address(5/6)
• User defined function ①
// domain name -> IP addressBOOL GetIPAddr(char *name, IN_ADDR *addr){ HOSTENT *ptr = gethostbyname(name); if(ptr == NULL){ err_display("gethostbyname()"); return FALSE; } memcpy(addr, ptr->h_addr, ptr->h_length); return TRUE;}
IT COOKBOOKIT COOKBOOK
- 26 -
coversion between domain name and IP address (6/6)
• User defined function ②
// IP address -> domain nameBOOL GetDomainName(IN_ADDR addr, char *name){ HOSTENT *ptr = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET); if(ptr == NULL){ err_display("gethostbyaddr()"); return FALSE; } strcpy(name, ptr->h_name); return TRUE;}
IT COOKBOOKIT COOKBOOK
- 27 -
Byte ordering function calls (6/6)
• INameResolution.cpp