chapter 03. socket address structures

27
Chapter 03. Socket Address Structures

Upload: xantha-mccarthy

Post on 03-Jan-2016

36 views

Category:

Documents


4 download

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

TRANSCRIPT

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