Lecture 5: Socket programming

advertisement
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
application
process
socket
application
process
transport
transport
network
network
link
physical
Internet
link
controlled by
app developer
controlled
by OS
physical
2-2
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
•
Each host machine has an IP
address (or more!)
Port 0
Port 1
•
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 65535
A socket provides an interface to send
data to/from the network through a
port
5
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
Application 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.
2-7
Ports
•
Each host machine has an IP
address (or more!)
Port 0
Port 1
•
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 65535
A socket provides an interface to send
data to/from the network through a
port
8
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-
Client/server socket interaction: UDP
server (running on serverIP)
create socket, port= x:
serverSocket =
socket(AF_INET,SOCK_DGRAM)
read datagram from
serverSocket
write reply to
serverSocket
specifying
client address,
port number
client
create socket:
clientSocket =
socket(AF_INET,SOCK_DGRAM)
Create datagram with server IP and
port=x; send datagram via
clientSocket
read datagram from
clientSocket
close
clientSocket
Application 2-11
Example app: UDP client
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
read reply characters from
socket into string
print out received string
and close socket
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()
2-
Example app: UDP server
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
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)
2-
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
application viewpoint:
TCP provides reliable, in-order
byte-stream transfer (“pipe”)
between client and server
2-
Client/server socket interaction: TCP
client
server (running on hostid)
create socket,
port=x, for incoming
request:
serverSocket = socket()
wait for incoming
TCP
connection request
connectionSocket = connection
serverSocket.accept()
read request from
connectionSocket
write reply to
connectionSocket
close
connectionSocket
setup
create socket,
connect to hostid, port=x
clientSocket = socket()
send request using
clientSocket
read reply from
clientSocket
close
clientSocket
2-
Example app: TCP client
Python TCPClient
create TCP socket for
server, remote port 12000
No need to attach server
name, port
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()
2-
Example app: TCP server
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)
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()
2-
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
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)
20
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
TCP Server
socket()
bind()
TCP Client
listen()
socket()
accept()
connect()
write()
connection establishment
data request
read()
data reply
write()
read()
close()
end-of-file notification
read()
close()
23
Connection setup steps
 Server end:
 Client end:
 step 2: request &
establish connection
 step 4: send/recv
Server
a-sock-1
l-sock
a-sock-2
socket
socket
Client1
Client2
 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
24
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
From: Dan Rubenstein’s slides: http://www.cs.columbia.edu/~danr/courses/6761/Summer03/intro/6761-1b-sockets.ppt
28
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
sin_port:
sin_addr:
sin_zero: unused
// Specifies the address family
// Specifies the port #(0-65535)
// Specifies the IP address
// unused!
From: Dan Rubenstein’s slides: http://www.cs.columbia.edu/~danr/courses/6761/Summer03/intro/6761-1b-sockets.ppt
29
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 (bigendian 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 ByteOrder once received)
30
Network Byte-Ordering
 u_long htonl(u_long x);
 u_long ntohl(u_long x);
 u_short htons(u_short x);
 u_short ntohs(u_short x);
•
•
On big-endian machines, these routines do nothing
On little-endian machines, they reverse the byte order
12
128
119
40
12
Little-Endian
12
machine
128
119
40
128.119.40.12
40
119 128
12
From: Dan Rubenstein’s slides: http://www.cs.columbia.edu/~danr/courses/6761/Summer03/intro/6761-1b-sockets.ppt
ntohl
128
119 40
128.119.40.12
Big-Endian
machine
31
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
our study of network apps now complete!
 application architectures

 client-server
 P2P
 application service requirements:
 reliability, bandwidth, delay
 Internet transport service model
 connection-oriented, reliable: TCP

specific protocols:
 HTTP
 FTP
 SMTP, POP, IMAP
 DNS
 P2P: BitTorrent, DHT
socket programming: TCP,
UDP sockets
 unreliable, datagrams: UDP
2-
summary
most importantly: learned about protocols!
 typical request/reply
message exchange:
important themes:

 client requests info or service
 server responds with data,
status code
 message formats:
 headers: fields giving info about
data
 data: info being communicated




control vs. data msgs
 in-band, out-of-band
centralized vs. decentralized
stateless vs. stateful
reliable vs. unreliable msg
transfer
“complexity at network
edge”
2-
Download