コード例 #1
0
ファイル: Server.cs プロジェクト: boomtnt46/NetSpeak
        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);
        }
コード例 #2
0
ファイル: Server.cs プロジェクト: boomtnt46/NetSpeak
        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);
        }
コード例 #3
0
ファイル: Server.cs プロジェクト: boomtnt46/NetSpeak
        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;
                    }
                }
            }));
        }