1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

20
1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming

Transcript of 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

Page 1: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

1

Writing Network Applications using the TCP/IP Protocol Stack:

Socket Programming

Page 2: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

2

Network Applications Communicating

TCP UDPIPLLPL

TCP UDPIPLLPL

TCP UDPIPLLPL

Web Browser

Web Server

FtpServer

FtpClient

RTSPServer

RealPlayer

Client: initiates contact with server (“speaks first”)• typically requests service from server, e.g., Web Browser

Server: provides requested service to client• e.g., Web server sends requested Web page

Typical network app has two pieces: client and server

Client-Server Paradigm

Page 3: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

3

How to program? The socket layer

TCP UDPIPLLPL

TCP UDPIPLLPL

TCP UDPIPLLPL

Web Browser

Web Server

FtpServer

FtpClient

RTSPServer

RealPlayer

Socket Layer

Socket Layer

Socket Layer

• Socket Layer: – Programmer’s API to the IP

Protocol stack

Page 4: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

4

Socket Creation

Family Type Protocol

TCPPF_INET

SOCK_STREAM IPPROTO_TCP

UDP SOCK_DGRAM IPPROTO_UDP

• mySock = socket(family, type, protocol);• TCP/IP-specific sockets

• Socket reference– File (socket) descriptor in UNIX– Socket handle in WinSock

Page 5: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

5

Specifying Addresses• struct sockaddr

{unsigned short sa_family; /* Address family (e.g.,

AF_INET) */char sa_data[14]; /* Protocol-specific address information

*/};

• struct sockaddr_in{

unsigned short sin_family; /* Internet protocol (AF_INET) */ unsigned short sin_port; /* Port (16-bits) */ struct in_addr sin_addr; /* Internet address (32-bits) */ char sin_zero[8]; /* Not used */

}; struct in_addr{

unsigned long s_addr; /* Internet address (32-bits) */};

Gen

eri

cIP

Sp

eci

fic

Page 6: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

6

TCP Client/Server Interaction

Client1. Create a TCP socket2. Establish connection3. Communicate4. Close the connection

Server1. Create a TCP socket2. Assign a port to socket3. Set socket to listen4. Repeatedly:

a. Accept new connectionb. Communicatec. Close the connection

Server starts by getting ready to receive client connections…

Page 7: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

7

TCP Client/Server Interaction

Client1. Create a TCP socket2. Establish connection3. Communicate4. Close the connection

Server1. Create a TCP socket2. Bind socket to a port3. Set socket to listen4. Repeatedly:

a. Accept new connectionb. Communicatec. Close the connection

/* Create socket for incoming connections */ if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithError("socket() failed");

Page 8: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

8

TCP Client/Server Interaction

Client1. Create a TCP socket2. Establish connection3. Communicate4. Close the connection

Server1. Create a TCP socket2. Bind socket to a port3. Set socket to listen4. Repeatedly:

a. Accept new connectionb. Communicatec. Close the connection

echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);/* Any incoming interface */ echoServAddr.sin_port = htons(echoServPort); /* Local port */

if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) DieWithError("bind() failed");

Page 9: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

9

TCP Client/Server Interaction

Client1. Create a TCP socket2. Establish connection3. Communicate4. Close the connection

Server1. Create a TCP socket2. Bind socket to a port3. Set socket to listen4. Repeatedly:

a. Accept new connectionb. Communicatec. Close the connection

/* Mark the socket so it will listen for incoming connections */ if (listen(servSock, MAXPENDING) < 0) DieWithError("listen() failed");

Page 10: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

10

TCP Client/Server Interaction

Client1. Create a TCP socket2. Establish connection3. Communicate4. Close the connection

Server1. Create a TCP socket2. Bind socket to a port3. Set socket to listen4. Repeatedly:

a. Accept new connectionb. Communicatec. Close the connection

for (;;) /* Run forever */{ clntLen = sizeof(echoClntAddr);

if ((clntSock=accept(servSock,(struct sockaddr *)&echoClntAddr,&clntLen)) < 0) DieWithError("accept() failed");

Page 11: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

11

TCP Client/Server Interaction

Client1. Create a TCP socket2. Establish connection3. Communicate4. Close the connection

Server1. Create a TCP socket2. Bind socket to a port3. Set socket to listen4. Repeatedly:

a. Accept new connectionb. Communicatec. Close the connection

Server is now blocked waiting for connection from a client

Page 12: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

12

TCP Client/Server Interaction

Client1. Create a TCP socket2. Establish connection3. Communicate4. Close the connection

Server1. Create a TCP socket2. Bind socket to a port3. Set socket to listen4. Repeatedly:

a. Accept new connectionb. Communicatec. Close the connection

Later, a client decides to talk to the server…

Page 13: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

13

TCP Client/Server Interaction

Client1. Create a TCP socket2. Establish connection3. Communicate4. Close the connection

Server1. Create a TCP socket2. Bind socket to a port3. Set socket to listen4. Repeatedly:

a. Accept new connectionb. Communicatec. Close the connection

/* Create a reliable, stream socket using TCP */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithError("socket() failed");

Page 14: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

14

TCP Client/Server Interaction

Client1. Create a TCP socket2. Establish connection3. Communicate4. Close the connection

Server1. Create a TCP socket2. Bind socket to a port3. Set socket to listen4. Repeatedly:

a. Accept new connectionb. Communicatec. Close the connection

echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */ echoServAddr.sin_port = htons(echoServPort); /* Server port */

if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) DieWithError("connect() failed");

Page 15: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

15

TCP Client/Server Interaction

Client1. Create a TCP socket2. Establish connection3. Communicate4. Close the connection

Server1. Create a TCP socket2. Bind socket to a port3. Set socket to listen4. Repeatedly:

a. Accept new connectionb. Communicatec. Close the connection

echoStringLen = strlen(echoString); /* Determine input length */

/* Send the string to the server */ if (send(sock, echoString, echoStringLen, 0) != echoStringLen) DieWithError("send() sent a different number of bytes than expected");

Page 16: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

16

TCP Client/Server Interaction

Client1. Create a TCP socket2. Establish connection3. Communicate4. Close the connection

Server1. Create a TCP socket2. Bind socket to a port3. Set socket to listen4. Repeatedly:

a. Accept new connectionb. Communicatec. Close the connection

/* Receive message from client */ if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0) DieWithError("recv() failed");

Page 17: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

17

TCP Client/Server Interaction

Client1. Create a TCP socket2. Establish connection3. Communicate4. Close the connection

Server1. Create a TCP socket2. Bind socket to a port3. Set socket to listen4. Repeatedly:

a. Accept new connectionb. Communicatec. Close the connection

close(sock); close(clntSocket)

Page 18: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

18

TCP Tidbits

Clientsend(“Hello Bob”)

recv() -> “Hi Jane”

Server

recv() -> “Hello ”recv() -> “Bob”send(“Hi ”)send(“Jane”)

Client knows server address and port No correlation between send() and recv()

Page 19: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

19

Closing a Connection

close() used to delimit communication Analogous to EOF

Clientsend(string)

while (not received entire string)recv(buffer)send(buffer)

close(socket)

Server

recv(buffer)while(client has not closed

connection)send(buffer)recv(buffer)

close(client socket)

Page 20: 1 Writing Network Applications using the TCP/IP Protocol Stack: Socket Programming.

20

UDP Client/Server Interaction

Client1. Create a UDP socket2. Communicate

(send/receive messages)3. When done, close the

connection

Server1. Create a UDP socket2. Assign a port to socket3. Communicate (receive/send

messages)4. When done, close the socket

Server starts by getting ready to receive client messages…