Comp 445
This presentation is the property of its rightful owner.
Sponsored Links
1 / 25

COMP 445 PowerPoint PPT Presentation


  • 102 Views
  • Uploaded on
  • Presentation posted in: General

COMP 445. Lab tutorial Lab assignment 2 Fall 2006 [email protected] Lab 2 Specification. Transfer files using UDP. Packets might be lost during the transfer. (router.cpp code drops packets) Output of program is the same as Lab1. There are couple of new concepts:

Download Presentation

COMP 445

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Comp 445

COMP 445

Lab tutorial

Lab assignment 2

Fall 2006

[email protected]


Lab 2 specification

Lab 2 Specification

  • Transfer files using UDP.

  • Packets might be lost during the transfer. (router.cpp code drops packets)

  • Output of program is the same as Lab1. There are couple of new concepts:

    • Stop and Wait protocol: to guarantee delivery

    • Three way handshake: to start the S/W protocol.


Lab 1

Lab 1

server

Client

TCP guarantees that all packets are delivered.


Stop and wait

Stop and wait

server

Client

If a packet is dropped, the server will not know


Stop and wait1

Stop and wait

server

Client

packet

Ack

packet

Ack

packet

Ack

Client waits for an Ack for every packet


Stop and wait2

Stop and wait

server

Client

packet

Ack

Wait for an ack.

After a timeout, send the same packet again

Packet LOST

packet

Ack

Client waits for an Ack for every packet


Stop and wait3

Stop and wait

server

Client

Packet

Ack

Wait for an ack.

After a timeout, send the same packet again

Packet

Ack LOST

Packet

Ack

How will the server know that the third packet is the same as the second packet.


Stop and wait4

Stop and wait

server

Client

Packet1

Ack1

Wait for an ack.

After a timeout, send the same packet again

Packet2

Ack2 LOST

Packet2

After checking the number, the client ignore this packet

Ack2

How will the server know that the third packet is the same as the second packet.

Solution: number the packets


Stop and wait numbering system

Stop and wait numbering system

server

Client

Packet0

Ack0

Wait for an ack.

After a timeout, send the same packet again

Packet1

Ack1 LOST

Packet1

Client expects packet0, when packet1 is received, it ignores it.

Ack1

How will the server know that the third packet is the same as the second packet.

Solution: number the packets


Three way hand shake

Three way hand shake

  • To fix the starting numbers at the source and destination, its good idea to add some hand shake above all this process.


Three way hand shake1

Three way hand shake

Client

server

36

Client generates random number let it be equal to 36

The server save this number, and generate its own number 55.

36, 55

55


Comp 445

send

Client

server

36

Client generates random number let it be equal to 36

The server save this number, and generate its own number 55.

36, 55

55

packet1

ack1


Receive

receive

Client

server

36

Client generates random number let it be equal to 36

The server save this number, and generate its own number 55.

36, 55

55

packet0

ack0


Program architecture

Program architecture

Server

port 5001

Client

port 5000

port 7000 | port 7001

Router

delay

discard


Main differences socket

Main differences - socket

Creating a UDP socket

  • Instead of:

    s = socket(AF_INET,SOCK_STREAM,0)

  • Use:

    s = socket(AF_INET,SOCK_DGRAM,0)

    Binding:

    Client: binds its socket with a physical address (IP : INADDR_ANY and port number : 5000)

    Server: binds its socket with a physical address (IP : INADDR_ANY and port number : 5001)


Comp 445

CLIENT

SOCKET s;

SOCKADDR_IN sa; // port 5000, client IP address

SOCKADDR_IN sa_in; // router info, IP, port(7000)

if((s = socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)

throw "Socket failed\n";

memset(&sa,0,sizeof(sa));

sa.sin_family = AF_INET;

sa.sin_port = htons(port);

sa.sin_addr.s_addr = htonl(INADDR_ANY); //host to network

//bind the port to the socket

if (bind(s,(LPSOCKADDR)&sa,sizeof(sa)) == SOCKET_ERROR)

throw "can't bind the socket";

cin >> remotehost;

rp=gethostbyname(remotehost);

memset(&sa_in,0,sizeof(sa_in));

memcpy(&sa_in.sin_addr, rp->h_addr, rp->h_length);

sa_in.sin_family = rp->h_addrtype;

sa_in.sin_port = htons(7000);


Comp 445

SERVER

SOCKET s;

SOCKADDR_IN sa; // port 5001, server IP address

SOCKADDR_IN sa_in; // router info, IP, port(7001)

if((s = socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)

throw "Socket failed\n";

memset(&sa,0,sizeof(sa));

sa.sin_family = AF_INET;

sa.sin_port = htons(port);

sa.sin_addr.s_addr = htonl(INADDR_ANY);

//bind the port to the socket

if (bind(s,(LPSOCKADDR)&sa,sizeof(sa)) == SOCKET_ERROR)

throw "can't bind the socket";

router IP and port numbers are obtained from the recvfrom(…) function.


Main differences sending

Main differences - sending

Sending frames – you pass the destination address to the send() function.

  • Instead of:

    ibytessent = send(s, (char*)&message_frame, sizeof(message_frame), 0);

  • Use:

    ibytessent = sendto(s, (const char*)&message_frame, sizeof(message_frame), 0,(struct sockaddr*) &sa_in, sizeof(sa_in));


Main differences receiving

Main differences - receiving

Receiving frames (you receive the socket address of the sender)

  • Instead of:

    ibytesrecv = recv(s, (char*)& message_frame, sizeof(message_frame),0)

  • Use:

    fd_set readfds; //fd_set is a typeFD_ZERO(&readfds); //initialize FD_SET(s, &readfds); //put the socket in the set

    if(!(outfds = select (1 , &readfds, NULL, NULL, & timeouts)))

    {//timed out, return}

    if (outfds == 1) //receive frame

    ibytesrecv = recvfrom(s, (char*)& message_frame, sizeof(message_frame),0, (struct sockaddr*)&fromAddr, &fromAddrSize);

If this parameter is NULL, you are listening forever


How to define a timer with 300ms for select

How to define a timer with 300ms for select?

#define UTIMER 300000

#define STIMER 0

struct timeval timeouts;

timeouts.tv_sec=STIMER;

timeouts.tv_usec=UTIMER;


Stop and wait protocol

Stop and wait protocol

Client

Send a packet

if time_out

send the packet again

else //ack received

send a new packet


Stop and wait protocol1

Stop and wait protocol

Server

wait for the first packet

send acknowledge

while(!EOF)

Get a packet;

Send an ack;


Packet structure used

Packet structure used

#define STOPNWAIT 1 //Bits width For stop and wait

struct MESSAGE_FRAME {

unsigned char header;

unsign int snwseq:STOPNWAIT;

char data[MAX_SIZE];//or error message

} message_frame;

struct THREE_WAY_HS{

int client_number;

int server_number;

int direction;

char file_name[FILE_NAME_SIZE];

} three_way_hs;


Three way hand shaking

Three way hand-shaking

#include <stdlib.h>

THREE_WAY_HS three_way_hs;

srand((unsigned)time(NULL));

CLIENT

SERVER

three_way_hs.client_number = rand();

You may send the file name and the direction here

three_way_hs.server_number = rand();

sequence_number = three_way_hs.server_number % 2;

Send an acknowledgment with sequence_number


Socket error 10054

”Socket error 10054”

If the client sends out its first packet, the router has received it and forwarded it to the server side. Then the Router displays an error”Socket error 10054” and the server seems to receive nothing. What’s wrong with my program?

check your receiving code of the server side, make sure you did every thing right(e.g when you are binding the server socket, you give the right port number to the server socket address)


  • Login