1 socket network programming 02/11/2008. admin. r programming assignment 1 update 2

74
1 Socket Network Programming 02/11/2008

Upload: brianne-barton

Post on 31-Dec-2015

217 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

1

Socket Network Programming

02/11/2008

Page 2: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Admin.

Programming assignment 1 update

2

Page 3: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Recap: P2P Scalability

BitTorrent as an example a swarming protocol each peer is given a set (~50) of peers upon

joining piece selection

• random at startup and (local) rarest after that peer selection

• periodically unchoke a few (4) peers with the highest rates sending to me

• optimistic unchoking

3

Page 4: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

4

UDP: Connectionless Demux

DatagramSocket serverSocket = new DatagramSocket(9876);

ClientIP:B

P2

client IP: A

P1P1P3

serverIP: S

SP: 9876

DP: 9157

SP: 9157

DP: 9876

SP: 9876

DP: 5775

SP: 5775

DP: 9876

Source Port (SP) provides “return address”

Page 5: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

5

Recap: UDP

closeclientSocket

Server (running on hostid)

read reply fromclientSocket

create socket,clientSocket = DatagramSocket()

Client

Create datagram using (hostid, x) as (dest addr. port),send request using clientSocket

create socket,port=x, forincoming request:serverSocket = DatagramSocket( x )

read request fromserverSocket

write reply toserverSocket

Create socket with port number:DatagramSocket sSock = new DatagramSocket(9876);

If no port number is specified, the OS will pick one

generate reply, create datagram using clienthost address, port number

Page 6: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

6

UDP Provides Multiplexing/Demultiplexing

server clientUDP socket space

address: {*:9876}snd/recv buf:

128.36.232.5128.36.230.2

address: {128.36.232.5:53}snd/recv buf:

UDP socket space

address: {198.69.10.10:1500}snd/recv buf:

address: {198.69.10.10:4343}snd/recv buf:

198.69.10.10

Packet demutiplexing is based on (dst address, dst port) at dst%netstat –u –n -a

local addresslocal port

Page 7: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

7

Example: Java server (UDP)

import java.io.*; import java.net.*; class UDPServer { public static void main(String args[]) throws Exception { DatagramSocket serverSocket = new DatagramSocket(9876); byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while(true) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

serverSocket.receive(receivePacket);

Createdatagram socket

at port 9876

Create space forreceived datagram

Receivedatagra

m

Page 8: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

8

Example: Java server (UDP), cont

String sentence = new String(receivePacket.getData()); InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); String capitalizedSentence = sentence.toUpperCase();

sendData = capitalizedSentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); serverSocket.send(sendPacket); } }

}

Get IP addrport #, of

sender

Write out datagramto socket

End of while loop,loop back and wait foranother datagram

Create datagramto send to client

Page 9: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

9

Example: Java client (UDP)

import java.io.*; import java.net.*; class UDPClient { public static void main(String args[]) throws Exception { BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName("hostname"); byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence = inFromUser.readLine();

sendData = sentence.getBytes();

Createinput stream

Create client socket

Translate hostname to IP

address using DNS

Page 10: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

10

Example: Java client (UDP), cont.

DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); clientSocket.send(sendPacket); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); }

}

Create datagram with data-to-send,

length, IP addr, port

Send datagramto server

Read datagramfrom server

Page 11: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

11

UDP Connectionless Demux

DatagramSocket serverSocket = new DatagramSocket(9876);

ClientIP:B

P2

client IP: A

P1P1P3

serverIP: S

SP: 9876

DP: 9157

SP: 9157

DP: 9876

SP: 9876

DP: 5775

SP: 5775

DP: 9876

Source Port (SP) provides “return address”

Page 12: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Recap: TCP Provides Connection-Oriented Demux

Webserver S

Web clienthost B

Source IP: BDest IP: S

source port: x

dest. port: 80

Source IP: BDest IP: S

source port: y

dest. port: 80

Web server

Web clienthost A

Source IP: ADest IP: S

source port: x

dest. port: 80

TCP separates data packetsfrom different peers intodifferent sockets

Page 13: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Big Picture: Connection-Oriented TCP

Page 14: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

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

TCP provides reliable, in-order transfer of bytes (“pipe”) between client and server

application viewpoint

Page 15: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

TCP Connection-Oriented Demux

TCP socket identified by 4-tuple: source IP address source port number dest IP address dest port number

recv host uses all four values to direct segment to appropriate socket server can easily support many simultaneous TCP

sockets: different connections/sessions are automatically separated into different sockets

Page 16: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

16

Connection-Oriented Demux

ClientIP:B

P1

client IP: A

P1P2P4

serverIP: S

SP: x

DP: 80

SP: y

DP: 80

P5 P6 P3

D-IP: SS-IP: A

D-IP: S

S-IP: B

SP: x

DP: 80

D-IP: SS-IP: B

Page 17: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Under the Hood: TCP Multiplexingserver client

TCP socket space

state: listeningaddress: {*:6789, *:*}completed connection queue:sendbuf:recvbuf:

128.36.232.5128.36.230.2

TCP socket space

state: listeningaddress: {*:25, *:*}completed connection queue: sendbuf:recvbuf:

198.69.10.10

state: listeningaddress: {*:25, *:*}completed connection queue: sendbuf:recvbuf:

state: startingaddress: {198.69.10.10:1500, *:*}sendbuf:recvbuf:

local addrlocal port

remote addr

remote port

%netstat –-tcp –all –l -n

Page 18: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Example: Client Initiates Connection

server clientTCP socket space

state: listeningaddress: {*:6789, *.*}completed connection queue:sendbuf:recvbuf:

128.36.232.5128.36.230.2

TCP socket space

state: listeningaddress: {*.25, *.*}completed connection queue:sendbuf:recvbuf:

198.69.10.10

state: listeningaddress: {*.25, *.*}completed connection queue:sendbuf:recvbuf:

state: connectingaddress: {198.69.10.10:1500, 128.36.232.5:6789}sendbuf:recvbuf:

Page 19: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Example: TCP Handshake Doneserver client

TCP socket space

state: listeningaddress: {*:6789, *:*}completed connection queue: {128.36.232.5.6789, 198.69.10.10.1500}sendbuf:recvbuf:

128.36.232.5128.36.230.2

TCP socket space

state: listeningaddress: {*:25, *:*}completed connection queue:sendbuf:recvbuf:

198.69.10.10

state: listeningaddress: {*:25, *:*}completed connection queue:sendbuf:recvbuf:

state: connectedaddress: {198.69.10.10:1500, 128.36.232.5:6789}sendbuf:recvbuf:

Page 20: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Example: Server accept()server client

TCP socket space

state: listeningaddress: {*.6789, *:*}completed connection queue: sendbuf:recvbuf:

128.36.232.5128.36.230.2

TCP socket space

state: listeningaddress: {*.25, *:*}completed connection queue:sendbuf:recvbuf:

198.69.10.10

state: listeningaddress: {*.25, *:*}completed connection queue:sendbuf:recvbuf:

state: connectedaddress: {198.69.10.10.1500, 128.36.232.5:6789}sendbuf:recvbuf:

state: establishedaddress: {128.36.232.5:6789, 198.69.10.10.1500}sendbuf:recvbuf:

Packet sent to the socket with the best match!Packet demutiplexing is based on (dst addr, dst port, src addr, src port)

Page 21: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Client/server socket interaction: TCP

wait for incomingconnection requestconnectionSocket =welcomeSocket.accept()

create socket,port=x, forincoming request:welcomeSocket =

ServerSocket(x)

create socket,connect to hostid, port=xclientSocket =

Socket()

closeconnectionSocket

read reply fromclientSocket

closeclientSocket

Server (running on hostid) Client

send request usingclientSocketread request from

connectionSocket

write reply toconnectionSocket

TCP connection setup

Page 22: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Example

Example client-server app:

1) client reads line from standard input (inFromUser stream) , sends to server via socket (outToServer stream)

2) server reads line from socket3) server converts line to

uppercase, sends back to client

4) client reads, prints modified line from socket (inFromServer stream)

outT

oSer

ver

to network from network

inFr

omS

erve

r

inFr

omU

ser

keyboard monitor

Process

clientSocket

inputstream

inputstream

outputstream

TCPsocket

Clientprocess

client TCP socket

Page 23: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Example: Java client (TCP)

import java.io.*; import java.net.*; class TCPClient {

public static void main(String argv[]) throws Exception { String sentence; String modifiedSentence;

BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));

Socket clientSocket = new Socket(“server.name", 6789);

DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

Createinput stream

Create client socket,

connect to server

Createoutput stream

attached to socket

Page 24: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Example: Java client (TCP), cont.

BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

sentence = inFromUser.readLine();

outToServer.writeBytes(sentence + '\n');

modifiedSentence = inFromServer.readLine();

System.out.println("FROM SERVER: " + modifiedSentence);

clientSocket.close(); } }

Createinput stream

attached to socket

Send lineto server

Read linefrom server

Page 25: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Example: Java server (TCP)import java.io.*; import java.net.*;

class TCPServer {

public static void main(String argv[]) throws Exception { String clientSentence; String capitalizedSentence;

ServerSocket welcomeSocket = new ServerSocket(6789); while(true) { Socket connectionSocket = welcomeSocket.accept();

BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

Createwelcoming socket

at port 6789

Wait, on welcomingsocket for contact

by client

Create inputstream, attached

to socket

Page 26: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Example: Java server (TCP), cont

DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());

clientSentence = inFromClient.readLine();

capitalizedSentence = clientSentence.toUpperCase() + '\n';

outToClient.writeBytes(capitalizedSentence); } } }

Read in linefrom socket

Create outputstream,

attached to socket

Write out lineto socket

End of while loop,loop back and wait foranother client connection

Page 27: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Outline

Recap Socket programming API

UDP TCP implementing a web server

Page 28: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Example: WebServer

A simple web server which supports only simple HTTP/1.0

http://zoo.cs.yale.edu/classes/cs433/programming/examples-java-socket/WebServer/

Page 29: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

WebServer Flow

TCP socket space

state: listeningaddress: {*.6789, *.*}completed connection queue: sendbuf:recvbuf:

128.36.232.5128.36.230.2

state: listeningaddress: {*.25, *.*}completed connection queue:sendbuf:recvbuf:

state: establishedaddress: {128.36.232.5:6789, 198.69.10.10.1500}sendbuf:recvbuf:

connSocket = accept()

Create ServerSocket(6789)

read request from connSocket

read local file

write file to connSocket

close connSocketDiscussion: what does each step do and how long does it take?

Page 30: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Writing High Performance Servers: Major Issues

Many socket/IO operations can cause a process to block, e.g., accept: waiting for new connection; read a socket waiting for data or close; write a socket waiting for buffer space; I/O read/write for disk to finish

Thus a crucial perspective of network server design is the concurrency design (non-blocking) for high performance to avoid denial of service

Concurrency is also important for clients!

Page 31: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Writing High Performance Servers: Using Multi-Threads

Using multiple threads so that only the flow

processing a particular request is blocked

Java: extends Thread or implements Runnable interface

Example: a Multi-threaded WebServer, which creates a thread for each request

Page 32: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Problems of Multi-Thread Server

High resource usage, context switch overhead, contended locks

Too many threads throughput meltdown, response time explosion

In practice: bound total number of threads

Page 33: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Event-Driven Programming

Event-driven programming, also called asynchronous i/o Using Finite State Machines (FSM) to monitor the progress of requests Yields efficient and scalable concurrency Many examples: Click router, Flash web server, TP Monitors, etc.

Java: asynchronous i/o for an example see: http://www.cafeaulait.org/books/jnp3/examples/12/

Page 34: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Async I/O in Java

An important class is the class Selector, which is a multiplexer of selectable channel objects example channels: DatagramChannel, Pipe, ServerSocketChannel, SocketChannel

use configureBlocking(false) to make a channel non-blocking

A selector may be created by invoking the open method of this class

Page 35: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Async I/O in Java

A selectable channel registers events (called a SelectionKey) with a selector with the register method

A SelectionKey object contains two operation sets interest Set ready Set

A SelectionKey object has an attachment which can store data often the attachment is a

buffer

Selector

Selection Key

Selectable Channel

register

Page 36: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Async I/O in Java

Call select (or selectNow(), or select(int timeout)) to check for ready events, called the selected key set

Iterate over the set to process all ready events

Page 37: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

Problems of Event-Driven Server

Difficult to engineer, modularize, and tune

Little OS and tool support: ‘‘roll your own’’

No performance/failure isolation between FSMs

FSM code can never block (but page faults, garbage collection may still force a block) thus still need multiple threads

Page 38: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

38

Backup

Page 39: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

39

Example 1: A Relay TCP Client

TCP client

TCP server

writen

readn

fgets

fputs

Check the code at http://zoo.cs.yale.edu/classes/cs433/programming/examples/tcpclient

Page 40: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

40

Backup: C/C++ Version

Page 41: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

41

Connectionless UDP: Big Picture

sd=Socket(): create socket

bind(sd, …): specify socket local IP address and port number

server client

read()/recv(): receive packets

close(): done

socket(): create socket

close(): done

write()/sendto(): send packets to server, by specifying receiver

address and port number

Page 42: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

42

Connection-oriented: Big Picture (C version)

sd=socket(): create socket

bind(sd, …): specify socket address

server client

TCP connection setup

listen(sd, …): specify that socket sd is a listening socket

sd2=accept(sd, …): get a connected connection from the queue for socket sd;

create a new socket identified by sd2

read()/write(): do IO on socket sd2

close(sd2): done

socket(): create socket

bind(): specify socket address

connect(): initialize TCP handshake;return until TCP handshake is done

read()/write(): do IO on the socket

close(): done

optional

Page 43: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

43

Unix Programming: Mechanism UNIX system calls and library routines

(functions called from C/C++ programs)

%man 2 <function name>

A word on style: check all return codes

if ((code = syscall()) < 0) {perror("syscall");

}

Page 44: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

44

Creating Sockets

#include <sys/types.h>#include <sys/socket.h>int socket(int domain, int type, int protocol);

- creates an endpoint for communication- return value: -1 if an error occurs;

otherwise the return value is a descriptor referencing the socket

- what are the possible outcomes of this system call?

Page 45: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

45

Creating Sockets: Parameters

domain : address family (protocol family) determine address structure e.g. AF_UNIX, AF_INET, AF_INET6 we will use AF_INET only

type : service of a socket e.g. SOCK_DGRAM provides unreliable,

connectionless service e.g. SOCK_STREAM provides connection-

oriented reliable byte-stream service

Page 46: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

46

Creating Sockets: Parameters (cont.)

protocol : specifies particular protocol Usually already defined by domain and type

(e.g. TCP for AF_INET and SOCK_STREAM; UDP for AF_INET and SOCK_DGRAM)

we will use 0 (default protocol) Example

if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) {

perror(“socket”);exit(1);

}

Page 47: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

47

Binding the Address for a Socket

#include <sys/types.h>#include <sys/socket.h>int bind(int sd, struct sockaddr *my_addr,

socklen_t addrlen);

- assigns the local address of a socket- return value: -1 if an error occurs;

otherwise 0- what are the possible outcomes of this

system call?

Page 48: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

48

Socket Address

Several types of addresses We will use sockaddr_in (<netinet/in.h>)

struct sockaddr_in {sa_family_t sin_family; /*AF_INET*/uint16_t sin_port; /* network order*/

struct in_addr sin_addr;};struct in_addr {

uint32_t s_addr; /* network order*/};

Two types of byte ordering: little endian, and big endian

Page 49: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

49

Internet Addresses and Ports

sin_port 16 bits 0-1024 reserved for system well-known ports are important If you specify 0, the OS picks a port

s_addr 32 bits INADDR_ANY for any local interface address

Page 50: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

50

Internet Addresses and Ports: Example

struct sockaddr_in myaddr;

bzero( (char*)myaddr, sizeof(myaddr) );myaddr.sin_family = AF_INET;myaddr.sin_port = htons(80); /* bind to HTTP port*/myaddr.sin_addr.s_addr = htos(INADDR_ANY); /* any address*/

if ( (bind(sockfd, (struct sockaddr*)&myaddr, sizeof(myaddr)) < 0 ) {perror(“bind”);exit(1);

}

Page 51: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

51

Set a Socket in the Listening State (Server)

#include <sys/types.h>#include <sys/socket.h>int listen(int sd, int backlog);

- Specify the willingness to accept new connection

- backlog : specify the number of pending connections

- return value: -1 if an error occurs; otherwise 0- what are the possible outcomes of this system

call?

Page 52: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

52

Initialize Connection Setup (Client)

#include <sys/types.h>#include <sys/socket.h>int connect(int sd, const struct sockaddr *serv_addr,

socklen_t addrlen);

- For SOCK_STREAM, initialize connection to the server; for SOCK_DGRAM, just set the destination address and set the socket in connected state

- return value: -1 if an error occurs; otherwise 0- what are the possible outcomes of this system

call?

Page 53: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

53

Accept a Connection (Server)

#include <sys/types.h>#include <sys/socket.h>int accept(int sd, struct sockaddr *peer_addr,

socklen_t addrlen);

- remove the first connection from the pending connection queue, create a new socket in connected state, the original sd is not changed and still in listening state

- return value: -1 if an error occurs; otherwise the descriptor of the newly connected socket

- what are the possible outcomes of this system call?

Page 54: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

54

Read/Write to a Socket

read()/write() of the file interface for connected-oriented

Socket specific system call send()/sendto()/sendmsg() recv()/recvfrom()/recvmsg()

Page 55: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

55

Read from a socket by using read()

#include <unistd.h>ssize_t read(int sockfd, void *buf, size_t

count);

- read up to count from the socket- return value: -1 if an error occurs; 0 if

end of file; otherwise number of bytes read

- what are the possible outcomes of this system call?

Page 56: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

56

Write to a socket by using write()

#include <unistd.h>ssize_t write(int sockfd, const void *buf,

size_t count);

- write up to count to the socket- return value: -1 if an error occurs;

otherwise number of bytes write- what are the possible outcomes of this

system call?

Page 57: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

57

Send to a Socket

#include <sys/types.h>#include <sys/socket.h>int send(int sd, const void *msg, size_t len, int

flags);int sendto(int sd, const void *msg, size_t len, int

flags, const struct sockaddr *to, socklen_t tolen);int sendmsg(int sd, const struct msghdr *msg, int

flags)

- return value: -1 if an error occurs; otherwise the number of bytes sent

Page 58: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

58

sendmsg(): scatter and collectstruct msghdr {

void *msg_name; // peer addresssocklen_t msg_namelen; // address length struct iovec *msg_iov; // io vectorsize_t msg_iovlen; // io vector lengthvoid *msg_control; socklen_t msg_controllen;int msg_flags;

};struct iovec {

void *iov_base;size_t iov_len;

};

Page 59: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

59

Receive from a Socket

#include <sys/types.h>#include <sys/socket.h>int recv(int sd, void *buf, size_t len, int flags);int recvfrom(int sd, void *buf, size_t len, int flags,

struct sockaddr *from, socklen_t fromlen);int recvmsg(int sd, struct msghdr *msg, int flags);

- return value: -1 if an error occurs; otherwise the number of bytes received

Page 60: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

60

Close a Socket

#include <unistd.h>int close(int sd);

- return value: -1 if an error occurs; otherwise 0

#include <sys/socket.h>int shutdown(int sd, int how);- how : if 0, no further receives; if 1, no further

sends; if 2, no further sends or receives

- return value: -1 if an error occurs; otherwise 0

Page 61: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

61

Support Routines: Address from and to

String Formats#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>

int inet_pton(int af, const char *src, void *dst);return value: positive if successful

const char *inet_ntop(int af, const void *src, char *dst, size_t cnt);

return value: NULL is error

Note: inet_addr() deprecated!

Page 62: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

62

Support Routines: Network/Host Order

#include <netinet/in.h>

unsigned long int htonl(unsigned long int hostlong);unsigned short int htons(unsigned short int

hostshort);

unsigned long int ntohl(unsigned long int networklong);

unsigned short int ntohs(unsigned short int networkshort);

Page 63: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

63

DNS Service

#include <netdb.h>extern int h_errno;

struct hostent *gethostbyname(const char *name);

Struct hostent {char *h_name; // official namechar **h_aliases; // a list of aliasesint h_addrtype;int h_length;char **h_addr_list;

}#define h_addr h_addr_list[0]- return value: NULL if fails

Page 64: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

64

Summary: Socket Programming %man 2 <name> System calls (functions)

int socket(int domain, int type, int protocol); int bind(int sd, struct sockaddr *my_addr, socklen_t

addrlen); int listen(int sd, int backlog); int connect(int sd, const struct sockaddr *serv_addr,

socklen_t addrlen); int accept(int sd, struct sockaddr *peer_addr, socklen_t

addrlen);

read(int sockfd, void *buf, size_t count); write(int sockfd, const void *buf, size_t count)

Page 65: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

65

Asynchronous Network Programming

(C/C++)

Page 66: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

66

A Relay TCP Client: telnet-like Program

TCP client

TCP server

writen

readn

fgets

fputs

http://zoo.cs.yale.edu/classes/cs433/programming/examples-c-socket/tcpclient

Page 67: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

67

Method 1: Process and Thread process

fork() waitpid()

Thread: light weight process pthread_create() pthread_exit()

Page 68: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

68

pthread

Void main() { char recvline[MAXLINE + 1]; ss = new socketstream(sockfd);

pthread_t tid; if (pthread_create(&tid, NULL, copy_to, NULL)) { err_quit("pthread_creat()"); }

while (ss->read_line(recvline, MAXLINE) > 0) { fprintf(stdout, "%s\n", recvline); }}

void *copy_to(void *arg) { char sendline[MAXLINE];

if (debug) cout << "Thread create()!" << endl; while (fgets(sendline, sizeof(sendline), stdin)) ss->writen_socket(sendline, strlen(sendline));

shutdown(sockfd, SHUT_WR); if (debug) cout << "Thread done!" << endl;

pthread_exit(0);}

Page 69: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

69

Method 2: Asynchronous I/O (Select)

select: deal with blocking system callint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

FD_CLR(int fd, fd_set *set);FD_ZERO(fd_set *set);FD_ISSET(int fd, fd_set *set);FD_SET(int fd, fd_set *set);

Page 70: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

70

Method 3: Signal and Select

signal: events such as timeout

Page 71: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

71

Examples of Network Programming

Library to make life easier Four design examples

TCP Client TCP server using select TCP server using process and thread Reliable UDP

Warning: It will be hard to listen to me reading through the code. Read the code.

Page 72: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

72

Example 2: A Concurrent TCP Server Using Process or Thread

Get a line, and echo it back Use select() For how to use process or thread, see

later Check the code at:

http://zoo.cs.yale.edu/classes/cs433/programming/examples-c-socket/tcpserver

Are there potential denial of service problems with the code?

Page 73: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

73

Example 3: A Concurrent HTTP TCP Server Using Process/Thread

Use process-per-request or thread-per- request

Check the code at:http://zoo.cs.yale.edu/classes/cs433/programming/examples-c-socket/simple_httpd

Page 74: 1 Socket Network Programming 02/11/2008. Admin. r Programming assignment 1 update 2

74

Example 4: Reliable UDP

How to implement timeout? Use SIGALARM Use setjmp() Check the code at:http://zoo.cs.yale.edu/classes/cs433/programming/examples-c-socket/udptimeout