TCP Socket Programming
What is a socket?
An abstract interface provided to the
application programmer
File descriptor, allows apps to read/write to
the network
Allows to processes on remotely
connected computers to talk to each other
Two types of sockets
SOCK_STREAM SOCK_DGRAM
TCP
UDP
connection oriented,
bidirectional no connection
reliable, in-order
unreliable delivery, no
delivery guarantee on the
order
can send/receive
Socket-programming using TCP
Socket: a door between application process and end-end-
transport protocol (UDP or TCP)
TCP service: reliable transfer of bytes from one process
to another
controlled by
controlled by process application
application process
developer
developer socket socket
controlled by TCP with TCP with controlled by
buffers, operating
operating buffers, internet system
system variables variables
host or host or
server server
CPSC 441 - Application Layer 4
Socket programming with TCP
Client must contact server When contacted by client,
server process must first be server TCP creates new
running socket for server process to
server must have created communicate with client
socket (door) that welcomes allows server to talk with
client’s contact multiple clients
Client contacts server by: source port numbers
creating client-local TCP used to distinguish
socket clients
specifying IP address, port
number of server process application viewpoint
When client creates socket: TCP provides reliable, in-order
client TCP establishes transfer of bytes (“pipe”)
connection to server TCP between client and server
CPSC 441 - Application Layer 5
Ports
Used to address processes on a host
0-1024 is usually reserved for known service
FTP Web
Server Server
21 80
Transport
Layer
Network
Layer
DLL/Physical
Socket Programming in C
CPSC 441 - Application Layer 7
Socket Programming - Flow
socket() socket()
bind()
connect()
listen()
Client Server
send()
accept()
wait for
recv() connection
.. recv() request from next
.
client
send()
close() close()
socket()
int s_listen = socket(family, type, protocol);
family: AF_INET specifies Ipv4
type: SOCK_STREAM, SOCK_DGRAM
protocol: 0 (pseudo, IP ). See /etc/protocols
bind()
bind(s_listen, localAdd, addLength)
Server specifies which port and address it will be
listening to
s_listen: our listening socket descriptor
localAdd: socket address structure
addLength: length of localAdd
Address Structure
struct sockaddr_in {
u_char sin_len; // length of address
u_char sin_family; // family of address
u_short sin_port; // protocol port num
struct in_addr sin_addr; // IP Addr
char sin_zero[8]; // set to zero, used for
padding
};
Address Structure
Declare address structure
struct sockaddr_in sockAdd;
Set family
sockAdd.sin_family = AF_INET;
Set IP address (2 ways)
//specify address to listen to
inet_pton(AF_INET, “127.0.0.1”, &sockAdd.sin_addr.s_addr)
//listen to any local address
sockAdd.sin_addr.s_addr = htonl(INADDR_ANY)
Set port
sockAdd.sin_port = htons(9999);
listen()
int status = listen(s_listen, queuelength);
status: -1 if error, 0 otherwise
s_listen: socket descriptor
queuelength: Number of clients that can “wait” for a connection
listen is non-blocking: returns immediately
accept()
int s_new = accept(s_listen, &clientAddress,
&addLength);
s_new: new socket for communication with client
s_listen: the listening socket
clientAddress: struct sockaddr, address of client
addLength: size of client address structure
accept is blocking: waits for connection before returning
Talking
int send(int s_new, const void *buf, int len, int
flags);
• s_new – socket descriptor
• buf – pointer to buffer
• len – size of buffer
• flags – can be safely set to 0
int recv(int s_new, void *buf, int len, unsigned
int flags);
• similar to send
• buf holds the data to be transferred
System calls - fork()
fork() is a C system call used to spawn child
processes
Execution for both child and parent process
continues at the next instruction
fork() returns
• 0 if this is the child process
• PID (>0) of the child process if this is the parent
• <0 if fork() fails
Used to keep listening on socket and talking
on another socket
Socket Programming in Java
CPSC 441 - Application Layer 17
Stream jargon
keyboard monitor
A stream is a sequence of
characters that flow into
or out of a process.
inFromUser
input
stream
An input stream is Client
Process
attached to some input process
source for the process,
e.g., keyboard or socket.
An output stream is
attached to an output
inFromServer
outToServer
output input
source, e.g., monitor or stream stream
socket.
client
clientSocket
TCP
socket TCP
socket
to network from network
CPSC 441 - Application Layer 18
Example: Java client (TCP)
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;
Create
input stream BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
Create
client socket, Socket clientSocket = new Socket("hostname", 6789);
connect to server
Create DataOutputStream outToServer =
output stream new DataOutputStream(clientSocket.getOutputStream());
attached to socket
CPSC 441 - Application Layer 19
Example: Java client (TCP), cont.
Create BufferedReader inFromServer =
input stream new BufferedReader(new
attached to socket InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
Send line
to server outToServer.writeBytes(sentence + '\n');
Read line modifiedSentence = inFromServer.readLine();
from server
System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();
}
}
CPSC 441 - Application Layer 20
Example: Java server (TCP)
import java.io.*;
import java.net.*;
class TCPServer {
public static void main(String argv[]) throws Exception
{
String clientSentence;
Create String capitalizedSentence;
welcoming socket
ServerSocket welcomeSocket = new ServerSocket(6789);
at port 6789
while(true) {
Wait, on welcoming
socket for contact Socket connectionSocket = welcomeSocket.accept();
by client
BufferedReader inFromClient =
Create input new BufferedReader(new
stream, attached InputStreamReader(connectionSocket.getInputStream()));
to socket
CPSC 441 - Application Layer 21
Example: Java server (TCP), cont
Create output
stream, attached DataOutputStream outToClient =
to socket new DataOutputStream(connectionSocket.getOutputStream());
Read in line
from socket clientSentence = inFromClient.readLine();
capitalizedSentence = clientSentence.toUpperCase() + '\n';
Write out line
outToClient.writeBytes(capitalizedSentence);
to socket
}
}
} End of while loop,
loop back and wait for
another client connection
CPSC 441 - Application Layer 22
Demo
A simple client – server example:
Echo Server
References
Socket Programming, Dan Rubinstein,
http://www1.cs.columbia.edu/~danr/courses/6761/Fall00/intro/6761-1b-
sockets.ppt
15-441 Socket Programming, www.cs.cmu.edu/afs/cs/academic/class/15441-
f01/www/lectures/lecture03.ppt
Network Programming, Geoff Kuenning,
www.cs.hmc.edu/~geoff/classes/hmc.cs105.200701/slides/class21_net2.ppt
Socket Programming, Abhinav Jain,
www.cs.purdue.edu/homes/jain8/cs422/pso3.ppt