Lecture 5: Socket programming

gorgeousvassalSoftware and s/w Development

Nov 7, 2013 (3 years and 11 months ago)

95 views

Socket
programming

Socket programming

What is a socket?

goal:

learn how to build client/server applications that communicate using
sockets

socket:

door between application process and end
-
end
-
transport protocol

2
-
2

Internet

controlled

by OS


controlled by

app developer

transport

application

physical

link

network

process

transport

application

physical

link

network

process

socket

What is a socket?


Socket is an interface between application and network
(the lower levels of the protocol stack)


The application creates a socket


The socket
type

dictates the style of communication


reliable vs. best effort


connection
-
oriented vs. connectionless



Once a socket is setup the application can


pass data to the socket for network transmission


receive data from the socket (transmitted through the
network, received from some other host)

3

Most popular types
of sockets


TCP socket


Type:
SOCK_STREAM


reliable
delivery


in
-
order guaranteed


connection
-
oriented


bidirectional




UDP socket


Type:
SOCK_DGRAM


unreliable delivery


no order guarantees


no notion of

connection




app indicates destination
for each packet


can send or receive

Ports

5


Each host machine has an
IP
address
(or more!)



Each
host has 65,536
ports

(2
?
)



As you know some
ports are
reserved

for specific apps


20,21: FTP


23: Telnet


80: HTTP


see RFC 1700 (about 2000 ports
are reserved)


Port 0

Port 1

Port 65535

A socket provides an interface to send
data to/from the network through a
port

Addresses, Ports and Sockets


Like apartments and mailboxes


You are the application


Your apartment building address is the address


Your mailbox is the port


The post
-
office is the network


The socket is the key that gives you access to the right
mailbox (one difference: assume outgoing mail is placed by
you in your mailbox)



Q: How do you choose which port a socket connects to?

6

Socket programming

2
-
7

A
pplication

Example:

1.
Client reads a line of characters (data) from its
keyboard and sends the data to the server.

2.
The server receives the data and converts
characters to uppercase.

3.
The server sends the modified data to the client.

4.
The client receives the modified data and displays
the line on its screen.

Ports

8


Each host machine has an
IP
address
(or more!)



Each
host has 65,536
ports

(2
?
)



As you know some
ports are
reserved

for specific apps


20,21: FTP


23: Telnet


80: HTTP


see RFC 1700 (about 2000 ports
are reserved)


Port 0

Port 1

Port 65535

A socket provides an interface to send
data to/from the network through a
port

Addresses, Ports and Sockets


Like apartments and mailboxes


You are the application


Your apartment building address is the address


Your mailbox is the port


The post
-
office is the network


The socket is the key that gives you access to the right
mailbox (one difference: assume outgoing mail is placed by
you in your mailbox)



Q: How do you choose which port a socket connects to?

9

Socket programming
with UDP

UDP: no

connection


between client & server


no handshaking before sending data


sender explicitly attaches IP destination address and port # to each packet


rcvr

extracts sender IP address and port# from received packet

UDP: transmitted data may be lost or received out
-
of
-
order

Application viewpoint:


UDP provides
unreliable

transfer of groups of bytes (

datagrams

) between
client and server

2
-
10

Client/server socket interaction: UDP

close

clientSocke
t

read datagram from

clientSocket

create socket:


clientSocket =

socket(AF_INET,SOCK_DGRAM)

Create datagram with server IP and

port=x; send datagram via

clientSocket

create socket, port= x:

serverSocket =

socket(AF_INET,SOCK_DGRAM)

read datagram from

serverSocke
t

write reply to

serverSocket

specifying

client address,

port number

Application 2
-
11

server

(running

on

serverIP
)

client

2
-
12

Example app: UDP client

from socket import *

serverName

= ‘hostname’

serverPort

= 12000

clientSocket

= socket(
socket.AF_INET
,


socket.SOCK_DGRAM
)

message =
raw_input
(’Input lowercase sentence:’)

clientSocket.sendto
(message,(
serverName
,
serverPort
))

modifiedMessage
,
serverAddress

=


clientSocket.recvfrom
(2048)

print
modifiedMessage

clientSocket.close
()

Python UDPClient

include Python’s socket

library

create UDP socket for
server

get user keyboard

input

Attach server name, port to
message; send into socket

print out received string
and close socket

read reply characters from

socket into string

2
-
13

Example app: UDP server

from socket import *

serverPort = 12000

serverSocket = socket(AF_INET, SOCK_DGRAM)

serverSocket.bind((
''
, serverPort))

print

The server is ready to receive


while 1:


message, clientAddress = serverSocket.recvfrom(2048)


modifiedMessage = message.upper()


serverSocket.sendto(modifiedMessage, clientAddress)

Python UDPServer

create UDP socket

bind socket to local port
number 12000

loop forever

Read from UDP socket into
message, getting client’s
address (client IP and port)

send upper case string
back to this client

Socket programming
with TCP

client must contact server


server process must first be
running


server must have created
socket (door) that welcomes
client

s contact

client contacts server by:


Creating TCP socket, specifying
IP address, port number of
server process


when client creates socket:

client
TCP establishes connection to
server TCP



when contacted by client,
server
TCP creates new socket

for server
process to communicate with
that particular client


allows server to talk with
multiple clients


source port numbers used to
distinguish
clients

2
-
14

TCP provides reliable, in
-
order

byte
-
stream transfer (

pipe

)

between client and server

application viewpoint:

Client/server socket interaction: TCP

2
-
15

wait for incoming

connection request

connectionSocket =

serverSocket.accept()

create socket,

port=
x
, for incoming
request:

serverSocket = socket()

create socket,

connect to
hostid
, port=
x

clientSocket = socket()

server

(running

on

hostid
)

client

send request using

clientSocket

read request from

connectionSocke
t

write reply to

connectionSocket

TCP

connection setup

close

connectionSocket

read reply from

clientSocket

close

clientSocket

2
-
16

Example app: TCP client

from socket import *

serverName

= ’
servername


serverPort

= 12000

clientSocket

= socket(AF_INET, SOCK_STREAM)

clientSocket.connect
((
serverName,serverPort
))

sentence =
raw_input
(‘Input lowercase sentence:’)

clientSocket.send
(sentence)

modifiedSentence

=
clientSocket.recv
(1024)

print ‘From Server:’,
modifiedSentence

clientSocket.close
()

Python TCPClient

create TCP socket for
server, remote port 12000

No need to attach server
name, port

2
-
17

Example app: TCP server


from socket import *

serverPort = 12000

serverSocket = socket(AF_INET,SOCK_STREAM)

serverSocket.bind((‘’,serverPort))

serverSocket.listen(1)

print ‘The server is ready to receive’

while 1:


connectionSocket, addr = serverSocket.accept()




sentence = connectionSocket.recv(1024)


capitalizedSentence = sentence.upper()


connectionSocket.send(capitalizedSentence)


connectionSocket.close()

Python TCPServer

create TCP welcoming

socket

server begins listening for
incoming TCP requests

loop forever

server waits on accept()

for incoming requests, new
socket created on return

read bytes from socket (but
not address as in UDP)

close connection to this
client (but
not

welcoming
socket)

Socket Creation in
C


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,


other values: need root permission, rarely used, or obsolete


protocol
: specifies protocol (see file
/etc/protocols

for a list of
options)
-

usually set to 0


NOTE:
socket

call does not specify where data will be coming
from, nor where it will be going to
-

it just creates the
interface.

18

The
bind

function


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


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



bind
can be skipped for both types of sockets. When and
why?


19

20

Skipping the
bind


SOCK_DGRAM
:


if only sending, no need to bind. The OS finds a port each
time the socket sends a pkt


if receiving, need to bind


SOCK_STREAM
:


destination determined during conn. setup


don

t need to know port sending from (during connection
setup, receiving end is informed of port)

On the connecting end



When connecting to another host (i.e.,
connecting
end
is the
client

and the
receiving end
is the
server
),
the OS automatically assigns a free port for the
outgoing connection.


During
connection setup, receiving end is informed
of port)


You can however bind to a specific port if need be.

21

Connection
Setup


A connection occurs between two ends


Server
: waits for an active participant to request connection


Client
: initiates connection request to passive side



Once connection is established, server and client ends
are

similar



both can send & receive data


either can terminate the connection

22

Server and clients

23

socket()

bind()

listen()

accept()

write()

read()

read()

TCP Server

close()

socket()

TCP Client

connect()

write()

read()

close()

connection establishment

data request

data

reply

end
-
of
-
file notification

Connection
setup steps


Server end:


step 1:
listen

(for
incoming requests)


step 3:
accept

(a request)


step 4: send/recv



The accepted connection
is on a new socket



The old socket continues
to listen for other active
participants


Client end:



step 2: request &
establish
connect
ion


step 4: send/recv

24

Server


l
-
sock

a
-
sock
-
1

a
-
sock
-
2


Client1

socket


Client2

socket

From: Dan Rubenstein

s slides: http://www.cs.columbia.edu/~danr/courses/6761/Summer03/intro/6761
-
1b
-
sockets.ppt

Server Socket:

listen

&
accept

Called on server side:


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


listen

is
non
-
blocking
: returns
immediately


int

s = accept(sock, &
addr
, &
addrlen
);


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


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


addr
:
struct

sockaddr
, address of the active participant


addrlen
:
sizeof
(
addr
):

value/result parameter


must be set appropriately before call


adjusted by OS upon return


accept
is
blocking
: waits for connection before returning

25

connect


int status = connect(sock, &addr, addrlen);


status
: 0 if successful connect,
-
1 otherwise


sock
: integer, socket to be used in connection


addr
:
struct sockaddr
: address of passive participant


addrlen
: integer,
sizeof(addr)


connect
is
blocking

26

Sending / Receiving Data


int

count = send(sock, &
buf
,
len
, flags);


count
: # bytes transmitted (
-
1 if error)


buf
:
void*,

buffer to be transmitted


len
: integer, length of buffer (in bytes) to transmit


flags
: integer, special options, usually just 0


int

count =
recv
(sock, &
buf
,
len
, flags);


count
: # bytes received (
-
1 if error)


buf
:
void*,

stores received bytes


len
: # bytes received


flags
: integer, special options, usually just 0



Calls are
blocking

[returns only after data is sent (to socket
buf
) / received]

27

close


When finished using a socket, the socket should be closed:



status = close(s);


status
: 0 if successful,
-
1 if error


s
: the file descriptor (socket being closed)



Closing a socket


closes a connection


frees up the port used by the socket


28

From: Dan Rubenstein

s slides: http://www.cs.columbia.edu/~danr/courses/6761/Summer03/intro/6761
-
1b
-
sockets.ppt

The
struct sockaddr


The struct to store the Internet address of a host:


struct sockaddr_in {

short sin_family;

u_short sin_port;

struct in_addr sin_addr;

char sin_zero[8];

};



sin_family = AF_INET


// Specifies the address family


sin_port
:




// Specifies the port #(0
-
65535)


sin_addr
:



// Specifies the IP address


sin_zero
: unused



// unused!

29

From: Dan Rubenstein

s slides: http://www.cs.columbia.edu/~danr/courses/6761/Summer03/intro/6761
-
1b
-
sockets.ppt

SOCKADDR Example

struct

sockaddr_in

server;



// Definition

memset
(&server, 0,
sizeof
(server));


//
Initilize

to 0

server.sin_family

= AF_INET;



// Set address family

server.sin_port

=
htons
(MYPORTNUM); // Set port

server.sin_addr.s_addr

=
htonl
(INADDR_ANY);// Set address



Host Byte
-
Ordering: the byte ordering used by a host (big
-
endian or little
-
endian
)


Network Byte
-
Ordering: the byte ordering used by the
network


always big
-
endian


Any words sent through the network should be converted to
Network Byte
-
Order prior to transmission (and back to Host Byte
-
Order once received)

30

Network Byte
-
Ordering


u_long htonl(u_long x);


u_short htons(u_short x);


u_long ntohl(u_long x);


u_short ntohs(u_short x);


31


On big
-
endian machines, these routines do nothing


On little
-
endian machines, they reverse the byte order

128.119.40.12

128

119

40

12

128.119.40.12

128

119

40

12

Big
-
Endian

machine

Little
-
Endian

machine

ntohl

128

119

40

12

128

119

40

12

From: Dan Rubenstein

s slides: http://www.cs.columbia.edu/~danr/courses/6761/Summer03/intro/6761
-
1b
-
sockets.ppt

TIPS 1


Sometimes,
an ungraceful exit
from a program (e.g.,
ctrl
-
c
)
does not properly free up a
port


Eventually
(after a few minutes), the port will be
freed


You can kill the process, or


To
reduce the likelihood of this problem, include the
following code
:


In header include:



#include <
signal.h
>



void
cleanExit
(){exit(0
);}



In
socket code:


signal(SIGTERM,
cleanExit
);


signal(SIGINT,
cleanExit
);

32

Tips 2



Check Beej's Guide to Network Programming Using
Internet Sockets

http://beej.us/guide/bgnet/output/html/multipage/index.html



Search the specification for the function you need
to use for more info, or check the man pages.


33

Tips 3


How to find the IP address of the machine my server
program is running on?



Use 127.0.0.1 or localhost for accessing a server running on
your local machine.



For a remote server running linux use the bash shell
command:

$ /sbin/ifconfig




For windows, use ipconfig in cmd

34

summary


application architectures


client
-
server


P2P


application service requirements:


reliability, bandwidth, delay


Internet transport service model


connection
-
oriented, reliable: TCP


unreliable, datagrams: UDP

our study of network apps now complete!

2
-
35


specific protocols:


HTTP


FTP


SMTP, POP, IMAP


DNS


P2P: BitTorrent, DHT


socket programming: TCP,
UDP sockets


typical request/reply
message exchange:


client requests info or service


server responds with data,
status code


message formats:


headers: fields giving info about
data


data: info being communicated

2
-
36

important themes:



control vs. data msgs


in
-
band, out
-
of
-
band


centralized vs. decentralized


stateless vs. stateful


reliable vs. unreliable msg
transfer



complexity at network
edge


summary

most importantly: learned about protocols!