27
Chapter 03. Socket Address Structures

Chapter 03. Socket Address Structures

Embed Size (px)

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 Presentation

Citation preview

Page 1: Chapter  03. Socket Address Structures

Chapter 03.

Socket Address Structures

Page 2: Chapter  03. Socket Address Structures

IT COOKBOOKIT COOKBOOK

- 2 -

Goal

• Socket address structures• Byte ordering• IP address conversion• Domain name conversion

Page 3: Chapter  03. Socket Address Structures

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

Page 4: Chapter  03. Socket Address Structures

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;

Page 5: Chapter  03. Socket Address Structures

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;

Page 6: Chapter  03. Socket Address Structures

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;

Page 7: Chapter  03. Socket Address Structures

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{}

Page 8: Chapter  03. Socket Address Structures

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...

Page 9: Chapter  03. Socket Address Structures

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

Page 10: Chapter  03. Socket Address Structures

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)

Page 11: Chapter  03. Socket Address Structures

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.

Page 12: Chapter  03. Socket Address Structures

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);

Page 13: Chapter  03. Socket Address Structures

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

Page 14: Chapter  03. Socket Address Structures

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

Page 15: Chapter  03. Socket Address Structures

IT COOKBOOKIT COOKBOOK

- 15 -

Byte ordering function calls (6/6)

• ByteOrder.cpp

Page 16: Chapter  03. Socket Address Structures

IT COOKBOOKIT COOKBOOK

- 16 -

Function calls to convert IP address (1/4)

• Example.

Page 17: Chapter  03. Socket Address Structures

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

Page 18: Chapter  03. Socket Address Structures

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, ...);

Page 19: Chapter  03. Socket Address Structures

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));

Page 20: Chapter  03. Socket Address Structures

IT COOKBOOKIT COOKBOOK

- 20 -

Byte ordering function calls (6/6)

• IPAddr.cpp

Page 21: Chapter  03. Socket Address Structures

IT COOKBOOKIT COOKBOOK

- 21 -

coversion between domain name and IP address (1/6)

• Example: Domain name IP address

Page 22: Chapter  03. Socket Address Structures

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));

Page 23: Chapter  03. Socket Address Structures

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;

Page 24: Chapter  03. Socket Address Structures

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

Page 25: Chapter  03. Socket Address Structures

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;}

Page 26: Chapter  03. Socket Address Structures

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;}

Page 27: Chapter  03. Socket Address Structures

IT COOKBOOKIT COOKBOOK

- 27 -

Byte ordering function calls (6/6)

• INameResolution.cpp