diff --git a/Echo/Client/Client.cs b/Echo/Client/Client.cs index d2e52de..948c84b 100644 --- a/Echo/Client/Client.cs +++ b/Echo/Client/Client.cs @@ -15,23 +15,52 @@ internal class Client while (true) { - string str = Console.ReadLine(); + string str = Console.ReadLine() ?? string.Empty; if (str == "exit") return; byte[] buffer = Encoding.UTF8.GetBytes(str); - socket.Send(buffer); + byte[] newBuffer = new byte[2 + buffer.Length]; + byte[] dataSize = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)buffer.Length)); - byte[] buffer2 = new byte[256]; - int byteRead = socket.Receive(buffer2); - if (byteRead < 1) + Array.Copy(dataSize, 0, newBuffer, 0, dataSize.Length); + Array.Copy(buffer, 0, newBuffer, 2, buffer.Length); + socket.Send(newBuffer); + + byte[] headerBuffer = new byte[2]; + int headerReceive = socket.Receive(headerBuffer); + if (headerReceive < 1) { - Console.WriteLine("Disconnecting server..."); + Console.WriteLine("Disconnecting client..."); return; } + else if (headerReceive == 1) + { + socket.Receive(headerBuffer, 1, 1, SocketFlags.None); + } + + short totalDataSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(headerBuffer)); + byte[] dataBuffer = new byte[totalDataSize]; + int dataReceived = 0; + while (dataReceived < totalDataSize) + { + int n = socket.Receive(dataBuffer, dataReceived, totalDataSize - dataReceived, SocketFlags.None); + dataReceived += n; + } + + string receivedMessage = Encoding.UTF8.GetString(dataBuffer); + Console.WriteLine($"[Received] {receivedMessage}"); + + //byte[] buffer2 = new byte[256]; + //int byteRead = socket.Receive(buffer2); + //if (byteRead < 1) + //{ + // Console.WriteLine("Disconnecting server..."); + // return; + //} - string str2 = Encoding.UTF8.GetString(buffer2); - Console.WriteLine($"[Receive] {str2}"); + //string str2 = Encoding.UTF8.GetString(buffer2); + //Console.WriteLine($"[Receive] {str2}"); } } } diff --git a/Echo/Server/Server.cs b/Echo/Server/Server.cs index 1308f1f..119135c 100644 --- a/Echo/Server/Server.cs +++ b/Echo/Server/Server.cs @@ -20,18 +20,34 @@ internal class Server while (true) { - byte[] buffer = new byte[256]; - int totalBytes = clientSocket.Receive(buffer); - if (totalBytes < 1) + byte[] headerBuffer = new byte[2]; + int headerReceive = clientSocket.Receive(headerBuffer); + if (headerReceive < 1) { Console.WriteLine("Disconnecting client..."); return; } + else if (headerReceive == 1) + { + clientSocket.Receive(headerBuffer, 0, 1, SocketFlags.None); + } + + short dataSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(headerBuffer)); + byte[] dataBuffer = new byte[dataSize]; + int dataReveiced = 0; + while (dataReveiced < dataSize) + { + int n = clientSocket.Receive(dataBuffer, dataReveiced, dataSize - dataReveiced, SocketFlags.None); + dataReveiced += n; + } - string str = Encoding.UTF8.GetString(buffer); + string str = Encoding.UTF8.GetString(dataBuffer); Console.WriteLine(str); - clientSocket.Send(buffer); + byte[] echoBuffer = new byte[2 + dataBuffer.Length]; + Array.Copy(headerBuffer, 0, echoBuffer, 0, headerBuffer.Length); + Array.Copy(dataBuffer, 0, echoBuffer, 2, dataBuffer.Length); + clientSocket.Send(echoBuffer); } } }