Skip to content
This repository has been archived by the owner on Aug 4, 2019. It is now read-only.

Commit

Permalink
we try RRQ/WRQ 10 times
Browse files Browse the repository at this point in the history
  • Loading branch information
lanrat committed Nov 26, 2012
1 parent 291b5b0 commit 3eb7971
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 16 deletions.
12 changes: 7 additions & 5 deletions filetransfer.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ bool sendFile(int sockfd, struct sockaddr* cli_addr, FILE* fileh)
n = fread(buffer,1,MAX_DATA_SIZE,fileh);

if (DEBUG) printf("Sending Data: [%u] ",blockNumber);
//TODO make gerneric
if (!send_data(sockfd, cli_addr, blockNumber,buffer,n))
{
return false;
Expand Down Expand Up @@ -91,7 +90,7 @@ bool sendFile(int sockfd, struct sockaddr* cli_addr, FILE* fileh)


/* This function recieves a file from a remote host client or server */
bool recvFile(int sockfd, struct sockaddr* cli_addr, FILE* fileh)
bool recvFile(int sockfd, struct sockaddr* cli_addr, FILE* fileh, char* filename)
{

PACKET packet;
Expand All @@ -106,6 +105,10 @@ bool recvFile(int sockfd, struct sockaddr* cli_addr, FILE* fileh)
if(timeout_counter < MAX_TFTP_TIMEOUTS)
{
//send gerneric
if (filename != NULL && blockNumber == 1) //resent the inital RRQ if we timeout on the first packet
{
send_RRQ(sockfd,cli_addr,filename,TFTP_SUPORTED_MODE);
}
timeout_counter++;
}
else
Expand All @@ -119,8 +122,7 @@ bool recvFile(int sockfd, struct sockaddr* cli_addr, FILE* fileh)
//error handler
printError(&packet);
return false;
}
else //correct packet type
}else //correct packet type
{
//check for correct blocknumber
if(packet.data.blockNumber == blockNumber)
Expand Down Expand Up @@ -154,6 +156,6 @@ bool recvFile(int sockfd, struct sockaddr* cli_addr, FILE* fileh)
}
}
}
} while(packet.data.dataSize == MAX_DATA_SIZE);
} while(packet.data.dataSize == MAX_DATA_SIZE || (blockNumber == 1 && filename != NULL));
return true;
}
2 changes: 1 addition & 1 deletion filetransfer.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@

bool sendFile(int sockfd,struct sockaddr* cli_addr, FILE* fileh);

bool recvFile(int sockfd, struct sockaddr* cli_addr,FILE* fileh);
bool recvFile(int sockfd, struct sockaddr* cli_addr,FILE* fileh, char* filename);
39 changes: 30 additions & 9 deletions tftpclient.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ void getFile(int port, char *filename)
printf("Error: couldn't send RRQ\n");
return;
}
if(!recvFile(sockfd, (struct sockaddr *) &serv_addr, file))
if(!recvFile(sockfd, (struct sockaddr *) &serv_addr, file,filename))
{
printf("Error: didn't receive file\n");
return;
Expand All @@ -65,7 +65,8 @@ void putFile(int port, char *filename)
struct sockaddr_in serv_addr;
PACKET packet;
int result;
FILE * file;
FILE * fileh;
int timeout_counter = 0;


if (strchr(filename,'/') != NULL )
Expand All @@ -75,9 +76,9 @@ void putFile(int port, char *filename)
}


file = fopen(filename, "rb");
fileh = fopen(filename, "rb");

if(file == NULL)
if(fileh == NULL)
{
perror(filename);
return;
Expand All @@ -97,22 +98,42 @@ void putFile(int port, char *filename)
printf("Error: couldn't send WRQ to server\n");
return;
}
result = waitForPacket(sockfd, (struct sockaddr *) &serv_addr, TFTP_OPTCODE_ACK, &packet);
while (timeout_counter < MAX_TFTP_TIMEOUTS)
{
result = waitForPacket(sockfd, (struct sockaddr *) &serv_addr, TFTP_OPTCODE_ACK, &packet);
if (result < 0)
{
printf("Error: Timeout sending packet to server\n");
if(!send_WRQ(sockfd, (struct sockaddr *) &serv_addr, filename, TFTP_SUPORTED_MODE))
{
printf("Error: couldn't send WRQ to server\n");
return;
}
timeout_counter++;
}else
{
break;
}
}
if (result < 0)
{
printf("Error: Could not send packet to server\n");
}else if (packet.optcode == TFTP_OPTCODE_ERR)
//we still timed out
printf("Timed out after %d tries, is the server running\n",MAX_TFTP_TIMEOUTS);
fclose(fileh);
return;
}
if (packet.optcode == TFTP_OPTCODE_ERR)
{
//we recieved an error, print it
printError(&packet);
}else
{
if (!sendFile(sockfd, (struct sockaddr *) &serv_addr, file))
if (!sendFile(sockfd, (struct sockaddr *) &serv_addr, fileh))
{
printf("Unable to send file to server\n");
}
}
fclose(file);
fclose(fileh);
return;
}

Expand Down
2 changes: 1 addition & 1 deletion tftpserver.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ bool server_recieve(int sockfd, struct sockaddr* cli_addr, PACKET* packet)
//send ack
send_ack(sockfd,cli_addr,0);

return recvFile(sockfd,cli_addr,fileh);
return recvFile(sockfd,cli_addr,fileh,NULL);
}

void run_child(struct sockaddr cli_addr, PACKET * packet)
Expand Down

0 comments on commit 3eb7971

Please sign in to comment.