Elementary TCP Sockets Unix Network Programming Ch # 4.

15
Elementary TCP Sockets Unix Network Programming Ch # 4

Transcript of Elementary TCP Sockets Unix Network Programming Ch # 4.

Page 1: Elementary TCP Sockets Unix Network Programming Ch # 4.

Elementary TCP Sockets

Unix Network Programming

Ch # 4

Page 2: Elementary TCP Sockets Unix Network Programming Ch # 4.

Elementary Socket functions

Page 3: Elementary TCP Sockets Unix Network Programming Ch # 4.

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

Page 4: Elementary TCP Sockets Unix Network Programming Ch # 4.

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.

Page 5: Elementary TCP Sockets Unix Network Programming Ch # 4.

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

Page 6: Elementary TCP Sockets Unix Network Programming Ch # 4.

Listen function

● The listen function is called only by a TCP

server and it performs 2 actions1.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);

Page 7: Elementary TCP Sockets Unix Network Programming Ch # 4.

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

Page 8: Elementary TCP Sockets Unix Network Programming Ch # 4.
Page 9: Elementary TCP Sockets Unix Network Programming Ch # 4.

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).

Page 10: Elementary TCP Sockets Unix Network Programming Ch # 4.

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)

Page 11: Elementary TCP Sockets Unix Network Programming Ch # 4.

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

Page 12: Elementary TCP Sockets Unix Network Programming Ch # 4.

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

Page 13: Elementary TCP Sockets Unix Network Programming Ch # 4.

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.

Page 14: Elementary TCP Sockets Unix Network Programming Ch # 4.

Concurrent Servers

Page 15: Elementary TCP Sockets Unix Network Programming Ch # 4.

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.