Socket programming Socket programming
Mar 29, 2015
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
controlledby OS
controlled byapp developer
transport
application
physical
link
network
process
transport
application
physical
link
network
processsocket
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
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.
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
closeclientSocket
read datagram fromclientSocket
create socket:clientSocket =socket(AF_INET,SOCK_DGRAM)
Create datagram with server IP andport=x; send datagram viaclientSocket
create socket, port= x:serverSocket =socket(AF_INET,SOCK_DGRAM)
read datagram fromserverSocket
write reply toserverSocketspecifying 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 UDPClientinclude Python’s socket library
create UDP socket for server
get user keyboardinput
Attach server name, port to message; send into socket
print out received string and close socket
read reply characters fromsocket 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-orderbyte-stream transfer (“pipe”) between client and server
application viewpoint:
Client/server socket interaction: TCP
2-15
wait for incomingconnection requestconnectionSocket =serverSocket.accept()
create socket,port=x, for incoming request:serverSocket = socket()
create socket,connect to hostid, port=xclientSocket = socket()
server (running on hostid) client
send request usingclientSocketread request from
connectionSocket
write reply toconnectionSocket
TCP connection setup
closeconnectionSocket
read reply fromclientSocket
closeclientSocket
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 = 12000serverSocket = 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 welcomingsocket
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 connection
step 4: send/recv
24
Server
l-socka-sock-1 a-sock-2
Client1socket
Client2socket
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
28From: 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!
29From: 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-Endianmachine
Little-Endianmachine
hton
l nto
hl
128
119
40 12 128
119
4012
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”
summarymost importantly: learned about
protocols!