3rd Edition: Chapter 2 - St. Francis Xavier University
Download
Report
Transcript 3rd Edition: Chapter 2 - St. Francis Xavier University
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
TCP
connection oriented,
bidirectional
reliable, in-order
delivery
SOCK_DGRAM
UDP
no connection
unreliable delivery, no
guarantee on the
order
can send/receive
Socket-programming using TCP
Socket: a door between application process and endend-transport protocol (UDP or TCP)
TCP service: reliable transfer of bytes from one
process to another
controlled by
application
developer
controlled by
operating
system
process
process
socket
TCP with
buffers,
variables
host or
server
internet
socket
TCP with
buffers,
variables
controlled by
application
developer
controlled by
operating
system
host or
server
CPSC 441 - Application Layer
4
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 client-local 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 client
allows server to talk with
multiple clients
source port numbers
used to distinguish
clients
application viewpoint
TCP provides reliable, in-order
transfer of bytes (“pipe”)
between client and server
CPSC 441 - Application Layer
5
Ports
Used to address processes on a host
0-1023 is usually reserved for known
service
1024-49151 are registered. They are used
for multiple purposes
FTP
Web
49152-65535 are private ports
Server Server
21
80
Transport
Layer
Network
Layer
DLL/Physical
Socket Programming in C
CPSC 441 - Application Layer
7
Socket Programming - Flow
socket()
connect()
Client
socket()
bind()
listen()
send()
Server
accept()
recv()
..
.
recv()
close()
close()
send()
wait for
connection
request from next
client
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
connect()
int connect(int sockfd, const struct sockaddr
*servaddr, socklen_t addrlen);
Connect to server.
sockfd is socket descriptor from socket()
servaddr is a pointer to a structure with:
port number and IP address
must be specified (unlike bind())
addrlen is length of structure
client doesn’t need bind()
OS will pick ephemeral port
returns socket descriptor if ok, -1 on error
CPSC 441 - Application Layer
10
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
Socket Address Structure
struct in_addr {
in_addr_t s_addr;
};
/* 32-bit IPv4 addresses */
struct sockaddr_in {
u_char sin_len;
/* length of address */
u_char sin_family; /* family of address, Ex. AF_INET */
u_short sin_port;
/* Protocol (TCP/UDP) Port num */
struct in_addr sin_addr; /* IPv4 address (above) */
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
Demo
A simple client – server example:
Echo Server
References
Socket Programming, Dan Rubinstein,
http://www1.cs.columbia.edu/~danr/courses/6761/Fall00/intro/6761-1bsockets.ppt
15-441 Socket Programming, www.cs.cmu.edu/afs/cs/academic/class/15441f01/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