diff --git a/FTPClient/.vs/FTPClient/v16/.suo b/FTPClient/.vs/FTPClient/v16/.suo index 6673e9a882835d38464b4c43250666caa156c4b9..cdd0ec8842a690d2b5d19bce85e2c178c60e3e1a 100644 Binary files a/FTPClient/.vs/FTPClient/v16/.suo and b/FTPClient/.vs/FTPClient/v16/.suo differ diff --git a/FTPClient/FTPClient/TftpClient.cs b/FTPClient/FTPClient/TftpClient.cs index ab36dad6c6659f41507ad5279cb9f43c29473513..c266e3c42b1846768ddc9e2888b2dda2b6fb64b0 100644 --- a/FTPClient/FTPClient/TftpClient.cs +++ b/FTPClient/FTPClient/TftpClient.cs @@ -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"); diff --git a/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.dll b/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.dll index 8832b7756ea377279498316e19228ee6711c22cf..f7283796f4fd1c1cd442ec7ebd62d0311b94e3f8 100644 Binary files a/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.dll and b/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.dll differ diff --git a/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.pdb b/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.pdb index b1f122fdd5c052389e6b8019d799446ccf9e98bd..5b1de4e2949fd3e2241beb1fde01a6329ef988af 100644 Binary files a/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.pdb and b/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.pdb differ diff --git a/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.dll b/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.dll index 8832b7756ea377279498316e19228ee6711c22cf..f7283796f4fd1c1cd442ec7ebd62d0311b94e3f8 100644 Binary files a/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.dll and b/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.dll differ diff --git a/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.pdb b/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.pdb index b1f122fdd5c052389e6b8019d799446ccf9e98bd..5b1de4e2949fd3e2241beb1fde01a6329ef988af 100644 Binary files a/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.pdb and b/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.pdb differ diff --git a/TFTPServer/.vs/TFTPServer/v16/.suo b/TFTPServer/.vs/TFTPServer/v16/.suo index 34d11f300cc8265c02311a98d2e652fd13d5dc8b..e403dfe508c21d2766bdc4af5c612dd567b65da4 100644 Binary files a/TFTPServer/.vs/TFTPServer/v16/.suo and b/TFTPServer/.vs/TFTPServer/v16/.suo differ diff --git a/TFTPServer/TFTPServer/Server.cs b/TFTPServer/TFTPServer/Server.cs index 052a3993f87aba55ae97a9376824713811a8f9a3..c97ebd584f5af8b1e0ad725383e383cc313ea6dd 100644 --- a/TFTPServer/TFTPServer/Server.cs +++ b/TFTPServer/TFTPServer/Server.cs @@ -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) { diff --git a/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.dll b/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.dll index 1deae0997e79168307c4c61c8bfb69bb0bea010f..f7fbf9166a5e4ef7e6b9523396b4c3f084d81794 100644 Binary files a/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.dll and b/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.dll differ diff --git a/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.pdb b/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.pdb index eb96aa419a0e6fa85f3db1ede9fd4cacd47d3c89..27b0cb57c81b89bbc2397f16f0c8b6ee6373a5dc 100644 Binary files a/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.pdb and b/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.pdb differ diff --git a/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.dll b/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.dll index 1deae0997e79168307c4c61c8bfb69bb0bea010f..f7fbf9166a5e4ef7e6b9523396b4c3f084d81794 100644 Binary files a/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.dll and b/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.dll differ diff --git a/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.pdb b/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.pdb index eb96aa419a0e6fa85f3db1ede9fd4cacd47d3c89..27b0cb57c81b89bbc2397f16f0c8b6ee6373a5dc 100644 Binary files a/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.pdb and b/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.pdb differ