private static void ReceiveMessage(Propagate propagate, string nick, byte[] buffer) { byte[] messageLengthBytes = new byte[2]; Buffer.BlockCopy(buffer, 1, messageLengthBytes, 0, 2); int length = BitConverter.ToInt16(messageLengthBytes, 0); //the length of bytes of the message byte[] messageBytes = new byte[length]; Buffer.BlockCopy(buffer, 3, messageBytes, 0, length); string message = nick + ":" + Encoding.UTF8.GetString(messageBytes); Console.WriteLine(message); propagate.PropagateMessages(message); }
private static string ReceiveNick(Propagate propagate, string nick, byte[] buffer) { Byte[] messageLengthBytes = new byte[2]; Buffer.BlockCopy(buffer, 1, messageLengthBytes, 0, 2); int length = BitConverter.ToInt16(messageLengthBytes, 0); byte[] messageBytes = new byte[length]; Buffer.BlockCopy(buffer, 3, messageBytes, 0, length); string newNick = Encoding.UTF8.GetString(messageBytes); if (nick != String.Empty) { string message = "User changer its nick: " + nick + " --------> " + newNick; Console.WriteLine(message); propagate.PropagateMessages(message); } nick = newNick; return(nick); }
private Task ConnectionHandler(Socket client, Propagate propagate) { bool authenticated = false; string nick = ""; byte[] buffer; Socket socket = client; DateTime keepAlive = DateTime.Now; propagate.list.Add(socket); return(Task.Run(() => { try { while (true) { buffer = new byte[4096]; //Max message size socket.Receive(buffer); if (requirePassword) { for (int x = 0; x < 3; x++) { if (!authenticated) { buffer = new byte[4096]; //Max message size socket.Receive(buffer); authenticated = ReceivePass(buffer, socket); //If true, allow user } else { socket.Shutdown(SocketShutdown.Both); socket.Disconnect(true); socket.Close(); clientNumber--; return; } } } byte versionByte = (byte)buffer.GetValue(0); if (versionByte == messagevByte) { ReceiveMessage(propagate, nick, buffer); } else if (versionByte == nickvByte) { nick = ReceiveNick(propagate, nick, buffer); } else if (versionByte == pingvByte) { keepAlive = DateTime.Now; } } } catch (Exception e) { if (e is SocketException && keepAlive.Second + 10 > DateTime.Now.Second) { Console.WriteLine(e.ToString()); Console.ForegroundColor = ConsoleColor.Red; Console.Write("Client '{0}' disconnected", nick); Console.ForegroundColor = ConsoleColor.White; socket.Shutdown(SocketShutdown.Both); socket.Disconnect(true); socket.Close(); clientNumber--; return; } else if (e is SocketException) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Lost connection with a client. The client '{0}' probably suffered an unexpected error. {1}No ping from '{0}' was received in the last 10 seconds.", nick, Environment.NewLine); Console.ForegroundColor = ConsoleColor.White; socket.Shutdown(SocketShutdown.Both); socket.Disconnect(true); socket.Close(); clientNumber--; return; } else { Console.WriteLine(e.ToString()); socket.Shutdown(SocketShutdown.Both); socket.Disconnect(true); socket.Close(); clientNumber--; return; } } })); }