UNP Chapter 4: Elementary TCP Sockets CMPS 105: Systems Programming - - PowerPoint PPT Presentation

unp chapter 4 elementary tcp sockets
SMART_READER_LITE
LIVE PREVIEW

UNP Chapter 4: Elementary TCP Sockets CMPS 105: Systems Programming - - PowerPoint PPT Presentation

UNP Chapter 4: Elementary TCP Sockets CMPS 105: Systems Programming Prof. Scott Brandt T Th 2-3:45 Soc Sci 2, Rm. 167 Introduction First: Elementary socket functions Next: TCP client-server example Concurrent services Common


slide-1
SLIDE 1

UNP Chapter 4: Elementary TCP Sockets

CMPS 105: Systems Programming

  • Prof. Scott Brandt

T Th 2-3:45 Soc Sci 2, Rm. 167

slide-2
SLIDE 2

Introduction

First: Elementary socket functions Next: TCP client-server example Concurrent services

Common Unix server technique Allows server to simultaneously serve

multiple clients

Server forks a separate process to serve

each client

slide-3
SLIDE 3

Typical TCP Client-Server Scenario

Figure 4.1 (p. 96) Server starts up Client starts up and connects to server Client contacts server Server processes client request Server responds to client Client closes connection Server goes back to waiting for clients to

connect

slide-4
SLIDE 4

socket()

To perform network I/O, a process first

calls socket()

Called by both client and server

# include < sys/socket.h> int socket(int family, int type, int

protocol);

returns a socket descriptor

slide-5
SLIDE 5

socket() parameters

family specifies the protocol family or domain

AF_INET: IPv4 protocols AF_INET6: IPv6 protocols AF_LOCAL: Unix domain protocols AF_ROUTE: Routing sockets AF_KEY: Key socket

Usually: AF_INET AF_LOCAL might work on CATS machines

slide-6
SLIDE 6

socket() parameters

type specifies type of communication

SOCK_STREAM: stream socket SOCK_DGRAM: datagram socket SOCK_SEQPACKET: sequenced packet

socket

SOCK_RAW: raw socket

TCP supports only SOCK_STREAM UDP supports SOCK_DGRAM

slide-7
SLIDE 7

socket() parameters

protocol specifies transport protocol

IPPROTO_TCP: TCP transport protocol IPPROTO_UDP: UDP transport protocol IPPROTO_SCTP: SCTP transport protocol

TCP provides reliable, in-order streaming

communication

Resends lost packets, guarantees order

UDP provides possibly unreliable, possibly

  • ut-of-order message delivery

Doesn’t guarantee anything, but usually works

fine

slide-8
SLIDE 8

connect()

Use 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 when the connection has been

established

Possible errors: timeout, host not

found, connection refused

slide-9
SLIDE 9

connect() parameters

sockfd is the socket descriptor returned

by socket()

servaddr is the socket address

Contains the IP address and port number

  • f the server

addrlen is the size of the address

structure

slide-10
SLIDE 10

bind()

Used by server to bind a socket to an IP

address/port pair

# include < sys/socket.h> int bind(int sockfd, const struct

sockaddr * myaddr, socklen_t addrlen);

Common error: EADDRINUSE

slide-11
SLIDE 11

bind() parameters

sockfd is the socket descriptor returned

by socket()

myaddr is the address of this server

Note: addresses are protocol-specific Usually well-known addresses so that

clients can find the server

addrlen is the length of the address

slide-12
SLIDE 12

listen()

Called by a TCP server to:

Set the socket up to receive connections Specify the maximum number of connections the

kernel should queue up for this socket

# include < sys/socket.h> int listen(int sockfd, int backlog); Normally called after socket() and bind() and

before accept()

sockfd is the socket descriptor from socket() backlog should be non-zero

slide-13
SLIDE 13

accept()

Called by a TCP server to return the next completed

connection from a client

Blocks if no connection is available

# include < sys/socket.h> int accept(int sockfd, struct sockaddr * cliaddr,

socklen_t * addrlen);

sockfd is the socket descriptor from socket() cliaddr is the address of the client that connected to

the server

Returns a new socket descriptor for the connection to

the client

slide-14
SLIDE 14

int main(int argc, char **argv) { int listenfd, connfd; struct sockaddr_in servaddr; char buff[maxline]; time_t ticks; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(13); // daytime sever bind(listenfd, (SA *) &servaddr, sizeof(servaddr)); listen(listenfd, LISTENQ); while(1) { connfd = accept(listenfd, (SA *)NULL, NULL); ticks = time(NULL); snprintf(buff, sizeof(buff), “%.24s\r\n”, ctime(&ticks)); write(connfd, buff, strlen(buff)); close(connfd); } }

slide-15
SLIDE 15

Concurrent Servers

The previous example is an iterative

server

It sequentially receives connections and

processes each request in turn

A concurrent server forks a child

process to handle each request

Multiple requests can be handled in parallel

by multiple concurrently executing child processes

slide-16
SLIDE 16

pid_t pid; int listenfd, connfd; listenfd = socket(…); bind(listenfd, …); listen(listenfd, LISTENQ); while(1) { connfd = accept(listenfd, …); if( (pid = fork()) == 0) { close(listenfd); doit(connfd); // service the request close(connfd); exit(0); } close(connfd); }

slide-17
SLIDE 17

close()

Normal close() is used to close sockets # include < unistd.h> int close(int sockfd);

slide-18
SLIDE 18

getsockname() and getpeername()

getsockname() returns the local

protocol address associate with a socket

Used to get socket address when

responding to a wildcard connection

getpeername() returns the foreign

protocol address associated with a socket

Used to get client address in an execed

process