Elementary TCP Sockets

Download Report

Transcript Elementary TCP Sockets

Elementary TCP Sockets
Unix Network Programming
Ch # 4
Elementary Socket functions
Socket Function
●
To perform network I/O, first thing a process
must do is call the socket function
#include <sys/socket.h>
int socket(int family, int type, int protocol);
- returns: non-negative descriptor if ok, -1 on error
Connect funciton
●
The connect function is used by a TCP client to
establish a connection with a TCP server:
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
–
–
–
–
Returns: 0 if ok, -1 on error
Sockfd is a socket descriptor returned by the socket function
2nd & 3rd args are the socket address structures, must contain the address of the
server to communicate with
The client does not have to call bind
● The kernel chooses both an ephemeral port and the source IP address if
necessary.
Bind function
●
●
The bind funtion assigns a local protocol
address to a socket.
With IP, combination of 32-bit (IPv4 or 128-bit
for IPv6) address, along with a 16-bit TCP or
UDP port number.
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
–
–
–
Servers bind to their well-known port when they start
A process can bind a specific IP address to its socket
Normally, however, a client does not bind an IP address, so that client can
then respond on any interface available on the host
Listen function
●
The listen function is called only by a TCP
server and it performs 2 actions
1.Converts an unconnected (active) socket into a
passive socket (indicates kernel should accept
incoming connect requests directed to this
socket
2. 2nd argument specifies the maximum number of
connections kernel should queue for this socket
#include <sys/socket.h>
int listen(int sockfd, int backlog);
Listen function
●
●
Normally called after both the socket and
bind function, only by the server of course
Backlog - for a given listening socket, the
kernel maintains 2 queues:
1. An incomplete connection queue, which contains an
entry for each SYN that has arrived from a client for
which server is awaiting completion of the TCP 3-way
handshake
2. A completed connection queue, entry for each client with
whom 3-way handshake has completed.
Figure 4.7, pg. 105
Accept function
●
Accept is called by a TCP server to return the
next completed connection from the front of
the completed connection queue.
–
If completed queue is empty, the process is put
to sleep.
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
–
–
Returns: non-negative descriptor if OK, -1 on error
The cliaddr and addrlen args are used to return the protocol address of the
connect peer process (the client).
Fork and exec functions
●
●
●
We will look at building a concurrent server
Need to create a new child process to handle
each incomming client request/transaction
fork function is the only way in Unix to create
a new process:
#include <unistd.h>
pid_t fork(void);
–
–
Returns: 0 in child, process ID of child in parent, -1 on error
Called once but returns TWICE
● Once in the parent process (returns child process id),
● and once in the child process (return of 0)
More Forking
●
All descriptors open in the parent before the
call to fork() are shared with the child after
fork returns.
–
Including the connected socket file description
returned by accept
Exec function
●
Only way in which an executable program file
on disk can be executed in Unix is for an
existing process to call one of the 6 exec
functions
Concurrent Servers
●
●
●
When a client request can take some time to
service, don't want to take away time for
handling connections to service a single
client
Handle the communication with multiple
clients at the same time
Simplest way to write a concurrent server
under Unix is to fork a child process to
handle each client.
Concurrent Servers
Close function
●
Close() function used to close a socket and
terminate a TCP connection
#include <unistd.h>
int close(int sockfd);
–
–
Returns: 0 if ok, -1 on error
Default action of close with a TCP socket description is to mark the socket
as closed and return tot he process immediately.
● Socket descriptor is no longer usable to the app process at this point
● But TCP will try to send any data that is already queued, and once
flushed begin the normal TCP termination sequence.