Presentation is loading. Please wait.

Presentation is loading. Please wait.

Lab tutorial Lab assignment 2 Fall 2006

Similar presentations


Presentation on theme: "Lab tutorial Lab assignment 2 Fall 2006"— Presentation transcript:

1 Lab tutorial Lab assignment 2 Fall 2006 ae_abdal@cs.concordia.ca
COMP 445 Lab tutorial Lab assignment 2 Fall 2006

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

3 Lab 1 server Client TCP guarantees that all packets are delivered.

4 Stop and wait server Client
If a packet is dropped, the server will not know

5 Stop and wait server Client packet Ack packet Ack packet Ack
Client waits for an Ack for every packet

6 Stop and wait server Client packet Ack Wait for an ack. Packet LOST
After a timeout, send the same packet again Packet LOST packet Ack Client waits for an Ack for every packet

7 Stop and wait server Client Packet Ack Wait for an ack. Packet
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.

8 Stop and wait server Client Packet1 Ack1 Wait for an ack. Packet2
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

9 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

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

11 Three way hand shake Client server 36
55 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 36 55 55 36 55

12 send 36 36 55 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 36 55 55 36 55 1 packet1 ack1

13 receive 36 36 55 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 36 55 55 36 55 packet0 1 ack0

14 Program architecture Server Client Router discard delay port 5001
port | port 7001 Router discard delay

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

16 SOCKADDR_IN sa; // port 5000, client IP address
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);

17 SOCKADDR_IN sa; // port 5001, server IP address
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.

18 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));

19 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 type FD_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 Readfds = file descriptor set for readable sockets

20 How to define a timer with 300ms for select?
#define UTIMER #define STIMER 0 struct timeval timeouts; timeouts.tv_sec=STIMER; timeouts.tv_usec=UTIMER; Readfds = file descriptor set for readable sockets

21 Stop and wait protocol Client Send a packet if time_out
send the packet again else //ack received send a new packet

22 Stop and wait protocol Server wait for the first packet
send acknowledge while(!EOF) Get a packet; Send an ack;

23 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;

24 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

25 ”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)


Download ppt "Lab tutorial Lab assignment 2 Fall 2006"

Similar presentations


Ads by Google