Skip to content
Snippets Groups Projects
Commit a35a3d27 authored by joalhelk's avatar joalhelk
Browse files

added resends of data and ack packets

parent 8833a99d
No related branches found
No related tags found
No related merge requests found
Showing
with 43 additions and 18 deletions
No preview for this file type
......@@ -169,23 +169,20 @@ namespace FTPClient
numBytesRead += n;
numBytesToRead -= n;
bool waitAck = true;
bool ackPassed = true;
int counter = 0;
do
{
waitAck = WaitAcknowledge(packetNumber, endpoint);
if(!waitAck)
ackPassed = WaitAcknowledge(packetNumber, endpoint);
if(!ackPassed)
{
socket.SendTo(buffer, endpoint);
}
counter += 1;
} while (waitAck && counter < 2);
if(waitAck)
{
Console.WriteLine("Clients ack packet was flawed...");
} while (!ackPassed && counter < 2);
if (!ackPassed)
break;
}
packetNumber += 1;
}
Console.WriteLine($"Sent {numBytesRead} bytes");
......
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
......@@ -84,7 +84,23 @@ namespace TFTPServer
numBytesRead += n;
numBytesToRead -= n;
if (!WaitAcknowledge(packetNumber, remote)) break;
bool ackPassed = true;
int counter = 0;
do
{
ackPassed = WaitAcknowledge(packetNumber, remote);
if (!ackPassed)
{
socket.SendTo(buffer, remote);
}
counter += 1;
} while (!ackPassed && counter < 2);
if (!ackPassed)
{
Console.WriteLine("Client didn't respond in time");
break;
}
packetNumber += 1;
}
Console.WriteLine($"Sent {numBytesRead} bytes");
......@@ -99,17 +115,23 @@ namespace TFTPServer
private static bool WaitAcknowledge(int number, EndPoint remote)
{
byte[] buffer = new byte[4];
socket.ReceiveFrom(buffer, ref remote);
try
{
socket.ReceiveFrom(buffer, ref remote);
int opcode = buffer[0] | buffer[1] << 8;
int block_number = buffer[2] | buffer[3] << 8;
int opcode = buffer[0] | buffer[1] << 8;
int block_number = buffer[2] | buffer[3] << 8;
if (opcode != (int)PACKET_TYPE.ACK || block_number != number)
if (opcode != (int)PACKET_TYPE.ACK || block_number != number)
{
SendError(remote, ERROR_CODE.Not_defined, "invalid ack packet");
return false;
}
return true;
} catch (SocketException)
{
SendError(remote, ERROR_CODE.Not_defined, "invalid ack packet");
return false;
}
return true;
}
/// <summary>
......@@ -204,7 +226,8 @@ namespace TFTPServer
{
string path = Path.Combine(FILE_DIR, filename + ".txt");
bool conversation = true;
int errorCount = 0;
// Create a file to write to.
using (StreamWriter sw = File.CreateText(path))
{
......@@ -213,12 +236,17 @@ namespace TFTPServer
byte[] packet = new byte[512];
socket.ReceiveFrom(packet, ref remote);
int opcode = packet[0] | packet[1] << 8;
int blockNumber = packet[2] | packet[3] << 8;
if (opcode == (int)PACKET_TYPE.DATA)
if (opcode == (int)PACKET_TYPE.DATA && blockNumber == (blockNumber + 1))
{
conversation = ReadData(packet, sw);
SendAck(remote);
blockNumber += 1;
} else if (errorCount < 1)
{
SendAck(remote);
errorCount += 1;
}
else if (opcode == (int)PACKET_TYPE.ERROR)
{
......@@ -301,7 +329,7 @@ namespace TFTPServer
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(iep);
//socket.ReceiveTimeout = socket_timeout;
socket.ReceiveTimeout = socket_timeout;
}
catch (Exception ex)
{
......
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment