TCP/IP Socket Programming

standguideNetworking and Communications

Oct 26, 2013 (4 years and 17 days ago)

85 views

1

Netcomm 2010
-

Recitation 1: Sockets

Communication Networks

Recitation 1

2

Netcomm 2010
-

Recitation 1: Sockets

Administrative


Hillel Avni


Email: hillel.avni@gmail.com


website:

http://www.cs.tau.ac.il/~hillelav/courses/co
mnet10.html



Grader:
Eran Cohen



erancoh1@post.tau.ac.il



3

Netcomm 2010
-

Recitation 1: Sockets

TCP/IP Socket Programming

4

Netcomm 2010
-

Recitation 1: Sockets

What is a socket?


An interface between application and
the network


The application can send/receive data
to/from the network
--

communicate

Application

Network API

Protocol A

Protocol B

Protocol C

5

Netcomm 2010
-

Recitation 1: Sockets

A Socket
-
eye view of the Internet


Each host machine has an IP address

medellin.cs.columbia.edu

(128.59.21.14)

cluster.cs.columbia.edu

(128.59.21.14, 128.59.16.7,
128.59.16.5, 128.59.16.4)

newworld.cs.umass.edu

(128.119.245.93)

6

Netcomm 2010
-

Recitation 1: Sockets

Ports

Port 0

Port 1

Port 65535


Each host has
65,536 ports


Some ports are
reserved for specific
apps


20,21: FTP


23: Telnet


80: HTTP


7

Netcomm 2010
-

Recitation 1: Sockets

Address Pair


An address is an IP+port


A socket provides an interface to an
IP:port pair

Remote IP: 123.45.6.78

Remote Port: 3726

Local IP: 111.22.3.4

Local Port: 2249

8

Netcomm 2010
-

Recitation 1: Sockets

Functions needed:


Specify local and remote
communication endpoints


Initiate a connection


Send and receive data


Terminate a connection

9

Netcomm 2010
-

Recitation 1: Sockets

Socket Creation in C: socket()


int s = socket(domain, type, protocol);


s: socket descriptor (an integer, like a file
-
handle)


domain: integer, communication domain


e.g.,
PF_INET

(IPv4 protocol)


typically used


type
: communication type


SOCK_STREAM
: reliable, 2
-
way, connection
-
based
service


SOCK_DGRAM
: unreliable, connectionless,


protocol
: specifies protocol (see file /etc/protocols
for a list of options)
-

usually set to 0

11

Netcomm 2010
-

Recitation 1: Sockets

Two essential types of sockets


SOCK_STREAM


a.k.a. TCP


reliable delivery


in
-
order guaranteed


connection
-
oriented


bidirectional


SOCK_DGRAM


a.k.a. UDP


unreliable delivery


no order guarantees


no notion of “connection”


can send or receive

App

socket

3

2

1

Dest.

App

socket

3

2

1

D
1

D3

D2

12

Netcomm 2010
-

Recitation 1: Sockets

The bind() function


associates and (can exclusively) reserves a
port for use by the socket


Done by the server


int status = bind(sockid, &addrport, size);


status
: error status, =
-
1
if bind failed


sockid
: integer, socket descriptor


addrport
: struct sockaddr, the (IP) address and
port of the machine. (address usually set to
INADDR_ANY


chooses a local address)


size
: the size (in bytes) of the addrport structure

13

Netcomm 2010
-

Recitation 1: Sockets

The struct sockaddr


The generic:

struct sockaddr {

u_short sa_family;

char sa_data[14];

};


sa_family


specifies which
address family is
being used


determines how
the remaining 14
bytes are used



The Internet
-
specific:

struct sockaddr_in {

short sin_family;

u_short sin_port;

struct in_addr sin_addr;

char sin_zero[8];

};


sin_family

= AF_INET


sin_port
: port # (0
-
65535)


sin_addr
: IP
-
address


sin_zero
: unused

14

Netcomm 2010
-

Recitation 1: Sockets

Address and port byte
-
ordering




Problem:


different machines / OS’s use different word
orderings


little
-
endian: lower bytes first


big
-
endian: higher bytes first


these machines may communicate with one another
over the network



128.119.40.12

128

119

40

12

12.40.119.128

128

119

40

12

Big
-
Endian

machine

Little
-
Endian

machine

15

Netcomm
2010
-

Recitation
1
: Sockets

Network Byte Order


All values stored in a
sockaddr_in

must be in network byte order.


Whenever the source of the address
isn’t the network, use htonl and htons

16

Netcomm 2010
-

Recitation 1: Sockets

Example

int sock;

sock = socket(PF_INET, SOCK_STREAM,
0
);

if (sock<
0
) { /* ERROR */ }


struct sockaddr_in myaddr;


myaddr.sin_family = AF_INET;

myaddr.sin_port = htons(
80
);

myaddr.sin_addr = htonl( INADDR_ANY );


bind(sock, &myaddr, sizeof(myaddr));

17

Netcomm
2010
-

Recitation
1
: Sockets

Connection Setup
(SOCK_STREAM)



A connection occurs between two kinds of
participants


passive: waits for an active participant to request
connection


active: initiates connection request to passive side


Once connection is established, passive and
active participants are “similar”


both can send & receive data


either can terminate the connection

18

Netcomm
2010
-

Recitation
1
: Sockets

Connection setup cont’d


Passive participant


step 1:
listen

(for
incoming requests)


step 3:
accept

(a
request)


step 4: data transfer


The accepted
connection is on a
new socket


The old socket
continues to listen


Active participant


step 2: request &
establish connection


step 4: data transfer

Passive Participant


l
-
sock

a
-
sock
-
1

a
-
sock
-
2


Active
1

socket


Active 2

socket

19

Netcomm
2010
-

Recitation
1
: Sockets

Connection est.: listen() & accept()


Called by passive participant


int status = listen(sock, queuelen);


status
:
0
if listening,
-
1
if error


sock
: integer, socket descriptor


queuelen
: integer, # of active participants that can
“wait” for a connection


int s = accept(sock, &name, &namelen);


s
: integer, the new socket (used for data
-
transfer)


sock
: integer, the orig. socket (being listened on)


name
: struct sockaddr, address of the active
participant


namelen
: sizeof(name): value/result parameter

20

Netcomm
2010
-

Recitation
1
: Sockets

Connection est.: connect()


Called by active participant


int status = connect(sock, &name, namelen);


status
: 0 if successful connect,
-
1 otherwise


sock
: integer, socket to be used in connection


name
: struct sockaddr: address of passive
participant


namelen
: integer, sizeof(name)

21

Netcomm 2010
-

Recitation 1: Sockets

Server example

int sock;

sock = socket(PF_INET, SOCK_STREAM, 0);

if (sock<0) { /* ERROR */ }


struct sockaddr_in myaddr;


myaddr.sin_family = AF_INET;

myaddr.sin_port = htons( 80 );

myaddr.sin_addr = htonl( INADDR_ANY );


bind(sock, &myaddr, sizeof(myaddr));

22

Netcomm
2010
-

Recitation
1
: Sockets

Server example

listen(sock,
5
);

int new_sock;

struct sockaddr_in their_addr;

sin_size = sizeof(struct sockaddr_in);

new_sock = accept(sock, (struct sockaddr
*)&their_addr, &sin_size);

23

Netcomm 2010
-

Recitation 1: Sockets

Client example

int sock;

sock = socket(PF_INET, SOCK_STREAM,
0
);

if (sock<
0
) { /* ERROR */ }


struct sockaddr_in dest_addr;


dest_addr.sin_family = AF_INET;

dest_addr.sin_port = htons(
80
);

dest_addr.sin_addr =
inet_addr(“
128.2.5.10
”)
;


connect(sock, (struct sockaddr *)&dest_addr,
sizeof(struct sockaddr));