Overview
qReview the Socket API
v Defined for UNIX
v Used by most operating systems
The Application Layer:
Sockets Wrap-Up
qReview text TCP and UDP examples
qFlowchart of socket programming
qOutline an SMTP server
CSC 249
October 1, 2012
slides mostly from J.F Kurose and K.W. Ross,copyright 1996-2012
Socket API Overview
Socket API Overview
q Socket Programming Procedures
v Socket()
v Bind()
v Listen()
v Accept()
v Connect()
v Along with send and receive procedures
v Close()
q In UNIX, all devices are file abstractions
v Open, close, read, write
q Sockets are simply one more file
abstraction
q Sockets are useful for sending data from
one host to another
q Most operating systems use The Socket
API as defined in/for UNIX
q And for DNS
v getHostByName
v getServByName
v getProtoByName
3
Sockets
Connection-Oriented TCP
q The API is used for communicating between a
q The message is only transferred after a
Client and a Server
q Client
v
v
connection has been made
q Both parties know that a message will be
communicated
q No need to tell destinations (IP address
and port number) in subsequent messages
Active participant in communication
Initiates conversations and sends data
q Server
v Passively listens and waits for data
q Socket
v Protocol to use?
v Idenfier of the other machine (IP + port)?
v Client or server?
5
SERVER
Connectionless UDP
socket()
q Send Individual Messages
bind()
q Socket has to be told where to send the
message every time
q Can get excessive if a large number of
messages need to be sent between the
same hosts
listen()
CLIENT
socket()
bind()
accept()
connect
()
recv()
send()
send()
recv()
(Optional)
TCP
Flow
Chart
bind()
recvfrom()
sendto()
keyboard
Client-server simple application:
socket()
bind()
sendto()
A first, simple socket example
1) The client reads a line from
standard input (inFromUser
stream), sends it to server via
socket (outToServer stream)
2) The server reads the line from its
socket
3) The server converts the line to
uppercase, and sends it back to the
client
4) The client reads the modified line
from its socket (inFromServer
stream) and prints it to standard
output
(Optional)
recvfrom()
Client
Process
process
input
stream
output
stream
monitor
inFromServer
socket()
CLIENT
inFromUser
UDP
Flow
Chart
outToServer
SERVER
input
stream
client
TCP
clientSocket
socket
to network
TCP
socket
from network
Example app: TCP client
Client/server socket interaction: TCP
Server
(running on hostid)
10
Python TCPClient
Client
create socket,
port=x, for
incoming request:
serverSocket = socket()
wait for incoming
connection request
TCP
connection setup
connectionSocket =
serverSocket.accept()
read request from
connectionSocket
write reply to
connectionSocket
close
connectionSocket
create TCP socket for
server, remote port 12000
create socket,
connect to hostid, port=x
clientSocket = socket()
No need to attach server
name, port
send request using
clientSocket
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()
read reply from
clientSocket
close
clientSocket
11
Application Layer
2-12
Example app: TCP server
Socket programming with UDP
Python TCPServer
read bytes from socket (but
not address as in UDP)
close connection to this
client (but not welcoming
socket)
sentence = connectionSocket.recv(1024)
capitalizedSentence = sentence.upper()
connectionSocket.send(capitalizedSentence)
connectionSocket.close()
Application Layer
application viewpoint
UDP provides unreliable transfer
of groups of bytes (datagrams)
between client and server
2-13
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
UDP: transmitted data may be received out of order,
or lost
14
Example: UDP client
keyboard
client
create socket:
clientSocket =
socket(AF_INET,SOCK_DGRAM)
Create datagram with server IP and
port=x; send datagram via
clientSocket
input
stream
Client
Process
monitor
Input: receives
process
packet (recall
that TCP sent
byte stream)
UDP
packet
client
UDP
clientSocket
socket
read datagram from
clientSocket
to network
close
clientSocket
Application 2-15
packet (recall that
TCP received
byte stream)
Output: sends
receivePacket
loop forever
server waits on accept()
for incoming requests, new
socket created on return
inFromUser
server begins listening for
incoming TCP requests
UDP: no connection between client and server
q no handshaking
q sender explicitly attaches IP address and port of
destination to each packet
q server must extract IP address, port of sender from
received packet
sendPacket
create TCP 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()
UDP
packet
UDP
socket
from network
16
Example app: UDP client
include Pythons 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
Example app: UDP server
Python UDPClient
Python UDPServer
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()
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print The server is ready to receive
while 1:
Application Layer
create UDP socket
bind socket to local port
number 12000
loop forever
Read from UDP socket into
message, getting clients
address (client IP and port)
send upper case string
back to this client
message, clientAddress = serverSocket.recvfrom(2048)
modifiedMessage = message.upper()
serverSocket.sendto(modifiedMessage, clientAddress)
2-17
Application Layer
Procedures: Socket()
Close()
q descriptor = socket(protoFamily, type)
v Creates a socket and returns an integer
descriptor
v ProtoFamily refers to Family of protocols that
this protocol belongs to, for TCP/IP use
PF_INET
v Type SOCK_STREAM, SOCK_DGRAM
q The socket is no longer going to be used
2-18
q Close(sock)
v Sock the descriptor
q Note: For a connection oriented socket,
connection is terminated before socket is
closed
SOCK_STREAM Connection Oriented
SOCK_DGRAM Connectionless Message
Transmission
19
20
Bind()
Listen() Server Procedure
q Bind(socket, localAddr, addrLen)
v Call after socket() has been called
v Used to assign the port at which the client/
server will be waiting for connections/
messages
q Listen(socket, queuesize)
v Called at server
v socket descriptor at server
v queueSize buffering of requests
The port number is part of the address structure
v
v
v
Socket descriptor
localAddr socket address structure
including the port number
addrLen length of the address
q This procedure tells the server to leave a
socket running, in passive mode, at this
port
21
22
Server Recap so far
Accept() Server Procedure
q All servers begin by making a function call
q Newsock = accept(socket, caddr, caddrlen)
v Accept() fills the fields of the struct caddr
with the address of the client that formed the
connection
v Accept() creates a new socket for this
connection and returns the descriptor of this
new socket
v The servers original listen() socket remains
unchanged
to socket() to create a socket and
bind() to specify a protocol port number
q UDP: the server is now ready to accept
messages
q TCP: additional steps to become ready are
v Server
calls listen() to place the socket in
passive mode
v Server calls accept() to accept a connection
request if it comes in
q A request has come to the server
v The phone is ringing
23
q Accept picks up the connections (only TCP)
24
Connect() Client Procedure
Send() and Sendto()
q Used to send packets from one host to
q Connect(socket, saddr, saddrlen)
v Arguments socket is the desciptor of a
socket on the clients computer to use for the
connection
v saddr and len specify the servers info
v With TCP, this initiates the connection to the
specified server
another
v Send(socket,
q This is used to make the phone call
data, length, flags)
Socket descriptor
Data pointer to buffer in memory with the data
Length of data to be sent
Flags for debugging, not general use (typ = 0)
q Sendto() is used with an unconnected
q Two uses
v Connection-oriented transport make the call
v Possible use - Connectionless identify the
server to send the many, independent messages
socket
v Sendto
(socket, data, length, flags,
destAddress, addressLen)
25
Recv() and Recvfrom()
Socket programming with TCP
What is the order of steps for using sockets with TCP
clients and servers together
q Server process must be running first
q Then the client can create a socket, which causes
q Used to receive messages in a connection
oriented communication
v Recv(socket,
buffer, length, flags)
Buffer memory location/structure to store the data
Length the length of buffer
v Recvfrom(socket,
saddrlen)
DNS lookup for server IP address
TCP to establish connection between the client and server
Which causes the server process to create a new, dedicated
socket for this specific client process
q Recvfrom() is used in connectionless
communication
26
q Client creates message as a byte stream
q Client sends the message into its socket
q TCP takes over and delivers the message
v Guarantees delivery
v With bytes delivered in the original order
buffer, flags, sndraddr,
Sndraddr senders address
Saddrlen length of senders address
q Server process performs its application duties and
27
sends a response message through its socket
28
# Example to connect to google
from socket import *
TCP vs. UDP
print "Creating Socket..."
s = socket(AF_INET, SOCK_STREAM)
print "done."
qWhere and when are IP addresses and
port numbers used in TCP vs. UDP
sockets?
print "Looking up port number..."
port = getservbyname('http', 'tcp')
print "done."
print "Connect to remote host on port %d"
%port,
s.connect (("www.google.com", port))
print "done."
print "Connected from", s.getsockname()
print "Connected to", s.getpeername()
29
# Client example 2: client2.py
# Run the client after the server is running
# Example 2: Server2.py
from socket import *
s = socket()
# Create a socket object
host = gethostname() # Get local machine name
port = 12345
# Assign a port number
from socket import * # Import socket module
s = socket()
# Create a socket object
host = gethostname() # Get local machine name
port = 12345
# Assign a port
s.bind((host, port)) # Bind to the port
print "Server host is ", host
s.listen(1)
# Wait for client conx
print "Client host is ", host
while True:
c, addr = s.accept() # conx to client
print 'Got connection from', addr
c.send('Thank you for connecting')
c.close()
# Close the connection
s.connect((host, port))
print s.recv(1024)
s.close
30
# Close the socket when done
31
32
Class Example: SMTP Client
#Sample SMTP client program -> server refuses contact
from socket import *
q Develop a simple mail client that sends
# Messages to send
msg = '\r\nHello World!
email to any recipient.
v Recall
the telnet practice with SMTP
v Connect to a mail server, dialogue with the mail
server using the SMTP protocol,
v Send an email message to the mail server.
Python provides smtplib, with built in methods,
but this hides the details of SMTP and socket
programming.
# Choose a mail server and call it mailserver
mailserver = 'smtp.smith.edu'
# Create socket, establish a TCP conx with mailserver
clientSocket = socket(AF_INET, SOCK_STREAM)
# Port number may change according to the mail server
clientSocket.connect((mailserver, 25))
recv = clientSocket.recv(1024)
print recv
if recv[:3] != '220':
print '220 reply not received from server.
q To limit spam, mail servers do not accept
TCP connection from arbitrary sources.
could try connecting both to both the Smith
mail server and to a popular Webmail server,
such as an AOL mail server, gmail
v You
33
# Send HELO command and print server response.
heloCommand = 'HELO smith.edu\r\n'
clientSocket.send(heloCommand)
recv1 = clientSocket.recv(1024)
print recv1
if recv1[:3] != '250':
print '250 reply not received from server.
34
HW: Web Server
qDevelop a web server that handles one
HTTP request at a time.
v Accept
# Send DATA command and print server response.
data = 'DATA\r\n'
clientSocket.send(data)
recv4 = clientSocket.recv(1024)
# Message ends with a single period.
clientSocket.send(endmsg)
# Send QUIT command and get server response.
quitcommand = 'QUIT\r\n'
clientSocket.send(quitcommand)
endmsg = '\r\n.\r\n'
35
and parse the HTTP request
message,
v Get the requested file from the servers
file system
v Create an HTTP response message
consisting of the requested file and the
appropriate header lines
v Send the response directly to the client.
v Use any web browser for the client
36