Download presentation
Published byAlban Boone Modified over 9 years ago
0
Socket Address Structures
Chapter 03. Socket Address Structures
1
Socket address structures Byte ordering IP address conversion
Goal Socket address structures Byte ordering IP address conversion Domain name conversion
2
Def. of socket address structures (1/6)
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
3
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;
4
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;
5
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;
6
Def. of socket address structures (5/6)
comparison of socket address structures SOCKADDR{} SOCKADDR_IN{} SOCKADDR_IRDA{} sa_family (2) sin_family (2) irdaAddressFamily (2) sa_data (14) sin_port (2) irdaDeviceID (4) sin_addr (4) irdaServiceName (25) sin_zero (8)
7
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 ...
8
Byte ordering function calls (1/6)
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 Big-endian Little-endian 0x1000 0x1001 0x1002 0x1003
9
Byte ordering function calls (2/6)
What if byte ordering is not considered in the below? End system router data IP address Port number ? (a) (b) (c)
10
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 Ref. network byte ordering : big-endian host byte ordering : byte ordering that system uses
11
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-short u_long htonl (u_long hostlong); // host-to-network-long u_short ntohs (u_short netshort); // network-to-host-short u_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);
12
Byte ordering function calls (5/6)
Use of byte ordering functions Data to pass Use data in application hton*( ) ntoh*( ) Data from socket call Socket system call Socket system call
13
Byte ordering function calls (6/6)
Byte ordering of SOCKADDR_IN structure sin_family (2) sin_port sin_addr (4) sin_zero (8) SOCKADDR_IN{} Host byte ordering Network byte ordering
14
Byte ordering function calls (6/6)
ByteOrder.cpp
15
Function calls to convert IP address (1/4)
Example.
16
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
17
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 structure SOCKADDR_IN addr; ZeroMemory(&addr, sizeof(addr)); // initialize to 0 addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(" "); addr.sin_port = htons(9010); // socket system call f((SOCKADDR *)&addr, ...);
18
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 structure SOCKADDR_IN addr; // socket system call g((SOCKADDR *)&addr, ...); // print IP address and port number printf("IP address=%s, port number=%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
19
Byte ordering function calls (6/6)
IPAddr.cpp
20
coversion between domain name and IP address (1/6)
Example: Domain name IP address
21
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)
22
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;
23
coversion between domain name and IP address(4/6)
hostent struct (cont’d) HOSTENT{} h_name official domain name\0 h_aliases alias #1\0 h_addrtype AF_INET alias #2\0 h_length 4 NULL h_addr_list IN_ADDR{} IP address #1 IP address #2 NULL h_length = 4
24
coversion between domain name and IP address(5/6)
User defined function ① // domain name -> IP address BOOL 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;
25
coversion between domain name and IP address (6/6)
User defined function ② // IP address -> domain name BOOL 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;
26
Byte ordering function calls (6/6)
INameResolution.cpp
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.