Beispiel #1
0
        private void ParsePacket(AsyncResultEventArgs <byte[]> args)
        {
            try
            {
                if (args.Error != null)
                {
                    throw args.Error;
                }

                if (args.Result == null)
                {
                    if (Habbo.LoggedIn)
                    {
                        Habbo.LoggedIn = false;
                    }
                    Disconnect("Socket read error!");
                    return;
                }

                ParseByteData(args.Result);
            }
            catch (Exception)
            {
                if (args.Error != null)
                {
                    string dumpPath = CoreManager.ServerCore.DumpException(args.Error);
                    CoreManager.ServerCore.ConsoleManager.Error("Game Socket Manager", CoreManager.ServerCore.StringLocale.GetString("CORE:ERROR_NETWORK_CONNECTION_KILLED"));
                    CoreManager.ServerCore.ConsoleManager.Error("Game Socket Manager", "    An exception dump has been saved to " + dumpPath);
                }
            }
        }
Beispiel #2
0
        private void IncomingConnectedAccepted(AsyncResultEventArgs <ServerChildTcpSocket> args)
        {
            if (args.Error != null)
            {
                // TODO: Die safely?
                CoreManager.ServerCore.StandardOut.Error("Game Socket Manager", "Incoming connection failed!!");

                // TODO: Pretty exception reporting
                Console.WriteLine();
                Console.WriteLine(args.Error.Message);
                Console.WriteLine(args.Error.StackTrace);

                _listeningSocket.AcceptAsync();
                return;
            }

            ServerChildTcpSocket internalSocket = args.Result;
            GameSocket           socket         = new GameSocket(internalSocket, Protocol);

            CancelReasonEventArgs connectionEventArgs = new CancelReasonEventArgs();

            CoreManager.ServerCore.OfficalEventFirer.Fire("incoming_game_connection", EventPriority.Before, socket, connectionEventArgs);
            if (connectionEventArgs.Cancel)
            {
                socket.Disconnect("Connection rejected from " + internalSocket.RemoteEndPoint + "(" + connectionEventArgs.CancelReason + ")");
                return;
            }

            socket.Start();

            CoreManager.ServerCore.OfficalEventFirer.Fire("incoming_game_connection", EventPriority.After, socket, connectionEventArgs);
            CoreManager.ServerCore.StandardOut.Notice("Game Socket Manager", "Incoming connection accepted: " + internalSocket.RemoteEndPoint);

            _listeningSocket.AcceptAsync();
        }
Beispiel #3
0
        private void IncomingConnectedAccepted(AsyncResultEventArgs<ServerChildTcpSocket> args)
        {
            if(args.Error != null)
            {
                string dumpPath = CoreManager.ServerCore.DumpException(args.Error);
                CoreManager.ServerCore.ConsoleManager.Error("Game Socket Manager", "Incoming connection failed!!");
                CoreManager.ServerCore.ConsoleManager.Error("Game Socket Manager", "    An exception dump has been saved to " + dumpPath);
                _listeningSocket.AcceptAsync();
                return;
            }

            ServerChildTcpSocket internalSocket = args.Result;
            GameSocket socket = new GameSocket(internalSocket, this);

            GameSocketEventArgs eventArgs = new GameSocketEventArgs(socket);

            CoreManager.ServerCore.OfficalEventFirer.Fire("incoming_game_connection:before", eventArgs);
            if (eventArgs.IsCancelled)
            {
                socket.Disconnect("Connection rejected from " + internalSocket.RemoteEndPoint + "(" + eventArgs.CancelReason + ")");
                return;
            }
            socket.Start();
            CoreManager.ServerCore.OfficalEventFirer.Fire("incoming_game_connection:after", eventArgs);
            CoreManager.ServerCore.ConsoleManager.Notice("Game Socket Manager", "Incoming connection accepted: " + internalSocket.RemoteEndPoint);

            _listeningSocket.AcceptAsync();
        }
Beispiel #4
0
        public void Exception_ForFailedArgs_IsPreserved()
        {
            Exception error = new Exception();
            var       test  = new AsyncResultEventArgs <int>(error);

            Assert.AreSame(error, test.Error, "Failed event args did not preserve exception");
        }
Beispiel #5
0
        public void UserState_ForSuccessfulArgsFullConstructor_IsPreserved()
        {
            object state = new object();
            var    test  = new AsyncResultEventArgs <int>(13, null, false, state);

            Assert.AreSame(state, test.UserState, "Successful event args did not preserve user state");
        }
Beispiel #6
0
        public void UserState_ForFailedArgsFullConstructor_IsPreserved()
        {
            object state = new object();
            var    test  = new AsyncResultEventArgs <int>(0, new Exception(), false, state);

            Assert.AreSame(state, test.UserState, "Failed event args did not preserve user state");
        }
Beispiel #7
0
        public void Exception_ForFailedArgsFullConstructor_IsPreserved()
        {
            Exception error = new Exception();
            var       test  = new AsyncResultEventArgs <int>(0, error, false, null);

            Assert.AreSame(error, test.Error, "Failed event args did not preserve exception");
        }
Beispiel #8
0
        private void IncomingConnectedAccepted(AsyncResultEventArgs<ServerChildTcpSocket> args)
        {
            if(args.Error != null)
            {
                // TODO: Die safely?
                CoreManager.ServerCore.StandardOut.Error("Game Socket Manager", "Incoming connection failed!!");

                // TODO: Pretty exception reporting
                Console.WriteLine();
                Console.WriteLine(args.Error.Message);
                Console.WriteLine(args.Error.StackTrace);

                _listeningSocket.AcceptAsync();
                return;
            }

            ServerChildTcpSocket internalSocket = args.Result;
            GameSocket socket = new GameSocket(internalSocket, Protocol);

            CancelReasonEventArgs connectionEventArgs = new CancelReasonEventArgs();

            CoreManager.ServerCore.OfficalEventFirer.Fire("incoming_game_connection", EventPriority.Before, socket, connectionEventArgs);
            if (connectionEventArgs.Cancel)
            {
                socket.Disconnect("Connection rejected from " + internalSocket.RemoteEndPoint + "(" + connectionEventArgs.CancelReason + ")");
                return;
            }

            socket.Start();

            CoreManager.ServerCore.OfficalEventFirer.Fire("incoming_game_connection", EventPriority.After, socket, connectionEventArgs);
            CoreManager.ServerCore.StandardOut.Notice("Game Socket Manager", "Incoming connection accepted: " + internalSocket.RemoteEndPoint);

            _listeningSocket.AcceptAsync();
        }
Beispiel #9
0
        public void UserState_ForCancelledArgsFullConstructor_IsPreserved()
        {
            object state = new object();
            var    test  = new AsyncResultEventArgs <int>(0, null, true, state);

            Assert.AreSame(state, test.UserState, "Cancelled event args did not preserve user state");
        }
Beispiel #10
0
        private void ParsePacket(AsyncResultEventArgs <byte[]> args)
        {
            try
            {
                if (args.Error != null)
                {
                    throw args.Error;
                }

                if (args.Result == null)
                {
                    if (Habbo.LoggedIn)
                    {
                        Habbo.LoggedIn = false;
                    }
                    Disconnect("Socket read error!");
                    return;
                }

                ParseByteData(args.Result);
            }
            catch (Exception)
            {
                if (args.Error != null)
                {
                    CoreManager.ServerCore.StandardOut.Error("Game Socket Manager", CoreManager.ServerCore.StringLocale.GetString("CORE:ERROR_NETWORK_CONNECTION_KILLED"));
                    Console.WriteLine();
                    Console.WriteLine(args.Error.Message);
                    Console.WriteLine(args.Error.StackTrace);
                }
            }
        }
Beispiel #11
0
        private void IncomingConnectedAccepted(AsyncResultEventArgs <ServerChildTcpSocket> args)
        {
            if (args.Error != null)
            {
                string dumpPath = CoreManager.ServerCore.DumpException(args.Error);
                CoreManager.ServerCore.ConsoleManager.Error("Game Socket Manager", "Incoming connection failed!!");
                CoreManager.ServerCore.ConsoleManager.Error("Game Socket Manager", "    An exception dump has been saved to " + dumpPath);
                _listeningSocket.AcceptAsync();
                return;
            }

            ServerChildTcpSocket internalSocket = args.Result;
            GameSocket           socket         = new GameSocket(internalSocket, this);

            GameSocketEventArgs eventArgs = new GameSocketEventArgs(socket);

            CoreManager.ServerCore.OfficalEventFirer.Fire("incoming_game_connection:before", eventArgs);
            if (eventArgs.IsCancelled)
            {
                socket.Disconnect("Connection rejected from " + internalSocket.RemoteEndPoint + "(" + eventArgs.CancelReason + ")");
                return;
            }
            socket.Start();
            CoreManager.ServerCore.OfficalEventFirer.Fire("incoming_game_connection:after", eventArgs);
            CoreManager.ServerCore.ConsoleManager.Notice("Game Socket Manager", "Incoming connection accepted: " + internalSocket.RemoteEndPoint);

            _listeningSocket.AcceptAsync();
        }
Beispiel #12
0
        private void ListeningSocket_ConnectionArrived(AsyncResultEventArgs <SimpleServerChildTcpSocket> e)
        {
            // Check for errors
            if (e.Error != null)
            {
                ResetListeningSocket();
                textBoxLog.AppendText("Socket error during Accept: [" + e.Error.GetType().Name + "] " + e.Error.Message + Environment.NewLine);
                RefreshDisplay();
                return;
            }

            SimpleServerChildTcpSocket socket = e.Result;

            try
            {
                // Save the new child socket connection
                ChildSockets.Add(socket, ChildSocketState.Connected);

                socket.PacketArrived     += (args) => ChildSocket_PacketArrived(socket, args);
                socket.WriteCompleted    += (args) => ChildSocket_WriteCompleted(socket, args);
                socket.ShutdownCompleted += (args) => ChildSocket_ShutdownCompleted(socket, args);

                // Display the connection information
                textBoxLog.AppendText("Connection established to " + socket.RemoteEndPoint.ToString() + Environment.NewLine);
            }
            catch (Exception ex)
            {
                ResetChildSocket(socket);
                textBoxLog.AppendText("Socket error accepting connection: [" + ex.GetType().Name + "] " + ex.Message + Environment.NewLine);
            }
            finally
            {
                RefreshDisplay();
            }
        }
Beispiel #13
0
 /// <summary>
 /// Handles the <see cref="ServerTcpSocket.AcceptCompleted"/> event by restarting the accept operation and notifying the user of a listen
 /// operation completion.
 /// </summary>
 /// <param name="e">The results of the accept operation.</param>
 private void SocketAcceptCompleted(AsyncResultEventArgs <ServerChildTcpSocket> e)
 {
     Socket.AcceptAsync();
     if (ConnectionArrived != null)
     {
         ConnectionArrived(ConvertArgs(e));
     }
 }
Beispiel #14
0
 /// <summary>
 /// Converts the results of an accept operation on a <see cref="ServerTcpSocket"/> to the results of a listen operation on a
 /// <see cref="SimpleServerTcpSocket"/>.
 /// </summary>
 /// <param name="e">The results of the accept operation.</param>
 /// <returns>The results of the listen operation.</returns>
 private static AsyncResultEventArgs <SimpleServerChildTcpSocket> ConvertArgs(AsyncResultEventArgs <ServerChildTcpSocket> e)
 {
     if (e.Error != null)
     {
         return(new AsyncResultEventArgs <SimpleServerChildTcpSocket>(e.Error));
     }
     return(new AsyncResultEventArgs <SimpleServerChildTcpSocket>(new SimpleServerChildTcpSocket(e.Result)));
 }
Beispiel #15
0
        private void SocketReadCompleted(AsyncResultEventArgs <int> args)
        {
            if (args.Error != null)
            {
                if (PacketArrived != null)
                {
                    PacketArrived.Invoke(new AsyncResultEventArgs <byte[]>(args.Error));
                }

                return;
            }

            _bytesReceived += args.Result;

            if (args.Result == 0)
            {
                if (PacketArrived != null)
                {
                    PacketArrived.Invoke(new AsyncResultEventArgs <byte[]>(null as byte[]));
                }
                return;
            }

            if (_dataBuffer == null)
            {
                if (_bytesReceived != Protocol.Reader.LengthBytes)
                {
                    ContinueReading();
                }
                else
                {
                    int length = Protocol.Reader.ParseLength(_lengthBuffer);

                    _dataBuffer    = new byte[length];
                    _bytesReceived = 0;
                    ContinueReading();
                }
            }
            else
            {
                if (_bytesReceived != _dataBuffer.Length)
                {
                    ContinueReading();
                }
                else
                {
                    if (PacketArrived != null)
                    {
                        PacketArrived.Invoke(new AsyncResultEventArgs <byte[]>(_dataBuffer));
                    }

                    _dataBuffer    = null;
                    _bytesReceived = 0;
                    ContinueReading();
                }
            }
        }
Beispiel #16
0
        private void ChildSocket_PacketArrived(ServerChildTcpSocket socket, AsyncResultEventArgs <byte[]> e)
        {
            try
            {
                // Check for errors
                if (e.Error != null)
                {
                    textBoxLog.AppendText("Client socket error during Read from " + socket.RemoteEndPoint.ToString() + ": [" + e.Error.GetType().Name + "] " + e.Error.Message + Environment.NewLine);
                    ResetChildSocket(socket);
                }
                else if (e.Result == null)
                {
                    // PacketArrived completes with a null packet when the other side gracefully closes the connection
                    textBoxLog.AppendText("Socket graceful close detected from " + socket.RemoteEndPoint.ToString() + Environment.NewLine);

                    // Close the socket and remove it from the list
                    ResetChildSocket(socket);
                }
                else
                {
                    // At this point, we know we actually got a message.

                    // Deserialize the message
                    object message = Messages.Util.Deserialize(e.Result);

                    // Handle the message
                    Messages.StringMessage stringMessage = message as Messages.StringMessage;
                    if (stringMessage != null)
                    {
                        textBoxLog.AppendText("Socket read got a string message from " + socket.RemoteEndPoint.ToString() + ": " + stringMessage.Message + Environment.NewLine);
                        return;
                    }

                    Messages.ComplexMessage complexMessage = message as Messages.ComplexMessage;
                    if (complexMessage != null)
                    {
                        textBoxLog.AppendText("Socket read got a complex message from " + socket.RemoteEndPoint.ToString() + ": (UniqueID = " + complexMessage.UniqueID.ToString() +
                                              ", Time = " + complexMessage.Time.ToString() + ", Message = " + complexMessage.Message + ")" + Environment.NewLine);
                        return;
                    }

                    textBoxLog.AppendText("Socket read got an unknown message from " + socket.RemoteEndPoint.ToString() + " of type " + message.GetType().Name + Environment.NewLine);
                }
            }
            catch (Exception ex)
            {
                textBoxLog.AppendText("Error reading from socket " + socket.RemoteEndPoint.ToString() + ": [" + ex.GetType().Name + "] " + ex.Message + Environment.NewLine);
                ResetChildSocket(socket);
            }
            finally
            {
                RefreshDisplay();
            }
        }
Beispiel #17
0
        private void ListeningSocket_AcceptCompleted(AsyncResultEventArgs <ServerChildTcpSocket> e)
        {
            // Check for errors
            if (e.Error != null)
            {
                ResetListeningSocket();
                textBoxLog.AppendText("Socket error during Accept: [" + e.Error.GetType().Name + "] " + e.Error.Message + Environment.NewLine);
                RefreshDisplay();
                return;
            }

            // Always continue listening for other connections
            ListeningSocket.AcceptAsync();

            ServerChildTcpSocket socket = e.Result;

            try
            {
                // Save the new child socket connection, and create a packetizer for it
                SocketPacketProtocol protocol = new SocketPacketProtocol(socket);
                ChildSocketContext   context  = new ChildSocketContext();
                context.Protocol = protocol;
                context.State    = ChildSocketState.Connected;
                ChildSockets.Add(socket, context);

                protocol.PacketArrived   += (args) => ChildSocket_PacketArrived(socket, args);
                socket.WriteCompleted    += (args) => ChildSocket_WriteCompleted(socket, args);
                socket.ShutdownCompleted += (args) => ChildSocket_ShutdownCompleted(socket, args);

                // Display the connection information
                textBoxLog.AppendText("Connection established to " + socket.RemoteEndPoint.ToString() + Environment.NewLine);

                // Start reading data from the connection
                protocol.Start();
            }
            catch (Exception ex)
            {
                ResetChildSocket(socket);
                textBoxLog.AppendText("Socket error accepting connection: [" + ex.GetType().Name + "] " + ex.Message + Environment.NewLine);
            }
            finally
            {
                RefreshDisplay();
            }
        }
Beispiel #18
0
        private void ChildSocket_PacketArrived(SimpleServerChildTcpSocket socket, AsyncResultEventArgs<byte[]> e)
        {
            try
            {
                // Check for errors
                if (e.Error != null)
                {
                    ConsoleService.Write("Client socket error during Read from " + socket.RemoteEndPoint + ": [" + e.Error.GetType().Name + "] " + e.Error.Message);
                    ResetChildSocket(socket);
                }
                else if (e.Result == null)
                {
                    // PacketArrived completes with a null packet when the other side gracefully closes the connection
                    ConsoleService.Write("Socket graceful close detected from " + socket.RemoteEndPoint);

                    // Close the socket and remove it from the list
                    ResetChildSocket(socket);
                }
                else
                {
                    // At this point, we know we actually got a message.

                    // Deserialize the message
                    object message = SerializationHelper.Deserialize(e.Result);

                    // Handle the message
                    if(HandleMessage(message, socket) == false)
                    {
                        ConsoleService.Write("Socket read got an unknown message from " + socket.RemoteEndPoint + " of type " + message.GetType().Name);
                    }
                }
            }
            catch (Exception ex)
            {
                ConsoleService.Write("Error reading from socket " + socket.RemoteEndPoint + ": [" + ex.GetType().Name + "] " + ex.Message);
                ResetChildSocket(socket);
            }
            finally
            {
                RefreshDisplay();
            }
        }
Beispiel #19
0
        private void ClientSocket_PacketArrived(AsyncResultEventArgs<byte[]> e)
        {
            try
            {
                // Check for errors
                if (e.Error != null)
                {
                    ResetSocket();
                    Console.WriteLine("Socket error during Read: [" + e.Error.GetType().Name + "] " + e.Error.Message);
                }
                else if (e.Result == null)
                {
                    // PacketArrived completes with a null packet when the other side gracefully closes the connection
                    Console.WriteLine("Socket graceful close detected");

                    // Close the socket and handle the state transition to disconnected.
                    ResetSocket();
                }
                else
                {
                    // At this point, we know we actually got a message.

                    // Deserialize the message
                    object message = SerializationHelper.Deserialize(e.Result);

                    if(HandleMessages(message) == false)
                    {
                        Console.WriteLine("Socket read got an unknown message of type " + message.GetType().Name);
                    }
                }
            }
            catch (Exception ex)
            {
                ResetSocket();
                Console.WriteLine("Error reading from socket: [" + ex.GetType().Name + "] " + ex.Message);
            }
            finally
            {
                RefreshDisplay();
            }
        }
Beispiel #20
0
        private void ListeningSocket_ConnectionArrived(AsyncResultEventArgs<SimpleServerChildTcpSocket> e)
        {
            // Check for errors
            if (e.Error != null)
            {
                ResetListeningSocket();
                ConsoleService.Write("Socket error during Accept: [" + e.Error.GetType().Name + "] " + e.Error.Message);
                RefreshDisplay();
                return;
            }

            SimpleServerChildTcpSocket socket = e.Result;

            try
            {
                // Save the new child socket connection
                Server.ChildSockets.Add(socket, ChildSocketState.Connected);
                Server.Clients.Add(socket, new ClientModel
                {
                    RemoteEndPoint = socket.RemoteEndPoint.ToString()
                });
                if (OnClientAddedHandler != null) OnClientAddedHandler(this, new OnClientAddedEventArgs(Server.Clients[socket]));

                socket.PacketArrived += args => ChildSocket_PacketArrived(socket, args);
                socket.WriteCompleted += args => ChildSocket_WriteCompleted(socket, args);
                socket.ShutdownCompleted += args => ChildSocket_ShutdownCompleted(socket, args);

                // Display the connection information
                ConsoleService.Write("Connection established to " + socket.RemoteEndPoint);
            }
            catch (Exception ex)
            {
                ResetChildSocket(socket);
                ConsoleService.Write("Socket error accepting connection: [" + ex.GetType().Name + "] " + ex.Message);
            }
            finally
            {
                RefreshDisplay();
            }
        }
Beispiel #21
0
 /// <summary>
 /// Converts the results of an accept operation on a <see cref="ServerTcpSocket"/> to the results of a listen operation on a
 /// <see cref="SimpleServerTcpSocket"/>.
 /// </summary>
 /// <param name="e">The results of the accept operation.</param>
 /// <returns>The results of the listen operation.</returns>
 private static AsyncResultEventArgs<SimpleServerChildTcpSocket> ConvertArgs(AsyncResultEventArgs<ServerChildTcpSocket> e)
 {
     if (e.Error != null)
         return new AsyncResultEventArgs<SimpleServerChildTcpSocket>(e.Error);
     return new AsyncResultEventArgs<SimpleServerChildTcpSocket>(new SimpleServerChildTcpSocket(e.Result));
 }
 public void Result_ForSuccessfulArgsFullConstructor_IsPreserved()
 {
     var test = new AsyncResultEventArgs<int>(13, null, false, null);
     Assert.AreEqual(13, test.Result, "Successful event args did not preserve result");
 }
 public void ReadingResult_ForFailedArgsFullConstructor_ThrowsTargetInvocationException()
 {
     var test = new AsyncResultEventArgs<int>(0, new Exception(), false, null);
     Trace.WriteLine(test.Result);
 }
 public void Result_ForSuccessfulArgs_IsPreserved()
 {
     var test = new AsyncResultEventArgs<int>(13);
     Assert.AreEqual(13, test.Result, "Successful event args did not preserve result");
 }
Beispiel #25
0
        public void Result_ForSuccessfulArgsFullConstructor_IsPreserved()
        {
            var test = new AsyncResultEventArgs <int>(13, null, false, null);

            Assert.AreEqual(13, test.Result, "Successful event args did not preserve result");
        }
 public void CancelledProperty_ForCancelledArgsFullConstructor_IsTrue()
 {
     var test = new AsyncResultEventArgs<int>(0, null, true, null);
     Assert.IsTrue(test.Cancelled, "Cancelled event args should be cancelled");
 }
Beispiel #27
0
        private void ChildSocket_PacketArrived(SimpleServerChildTcpSocket socket, AsyncResultEventArgs<byte[]> e)
        {
            try
            {
                // Check for errors
                if (e.Error != null)
                {
                    ConsoleService.Write("Client socket error during Read from " + socket.RemoteEndPoint + ": [" + e.Error.GetType().Name + "] " + e.Error.Message);
                    ResetChildSocket(socket);
                }
                else if (e.Result == null)
                {
                    // PacketArrived completes with a null packet when the other side gracefully closes the connection
                    ConsoleService.Write("Socket graceful close detected from " + socket.RemoteEndPoint);

                    // Close the socket and remove it from the list
                    ResetChildSocket(socket);
                }
                else
                {
                    // At this point, we know we actually got a message.

                    // Deserialize the message
                    object message = SerializationHelper.Deserialize(e.Result);

                    // Handle the message
                    if(HandleMessage(message, socket) == false)
                    {
                        ConsoleService.Write("Socket read got an unknown message from " + socket.RemoteEndPoint + " of type " + message.GetType().Name);
                    }
                }
            }
            catch (Exception ex)
            {
                ConsoleService.Write("Error reading from socket " + socket.RemoteEndPoint + ": [" + ex.GetType().Name + "] " + ex.Message);
                ResetChildSocket(socket);
            }
            finally
            {
                RefreshDisplay();
            }
        }
Beispiel #28
0
        private void ListeningSocket_ConnectionArrived(AsyncResultEventArgs<SimpleServerChildTcpSocket> e)
        {
            // Check for errors
            if (e.Error != null)
            {
                ResetListeningSocket();
                ConsoleService.Write("Socket error during Accept: [" + e.Error.GetType().Name + "] " + e.Error.Message);
                RefreshDisplay();
                return;
            }

            SimpleServerChildTcpSocket socket = e.Result;

            try
            {
                // Save the new child socket connection
                Server.ChildSockets.Add(socket, ChildSocketState.Connected);
                Server.Clients.Add(socket, new ClientModel
                {
                    RemoteEndPoint = socket.RemoteEndPoint.ToString()
                });
                if (OnClientAddedHandler != null) OnClientAddedHandler(this, new OnClientAddedEventArgs(Server.Clients[socket]));

                socket.PacketArrived += args => ChildSocket_PacketArrived(socket, args);
                socket.WriteCompleted += args => ChildSocket_WriteCompleted(socket, args);
                socket.ShutdownCompleted += args => ChildSocket_ShutdownCompleted(socket, args);

                // Display the connection information
                ConsoleService.Write("Connection established to " + socket.RemoteEndPoint);
            }
            catch (Exception ex)
            {
                ResetChildSocket(socket);
                ConsoleService.Write("Socket error accepting connection: [" + ex.GetType().Name + "] " + ex.Message);
            }
            finally
            {
                RefreshDisplay();
            }
        }
 public void CancelledProperty_ForSuccessfulArgs_IsFalse()
 {
     var test = new AsyncResultEventArgs<int>(13);
     Assert.IsFalse(test.Cancelled, "Successful event args should not be cancelled");
 }
 public void CancelledProperty_ForSuccessfulArgsFullConstructor_IsFalse()
 {
     var test = new AsyncResultEventArgs<int>(13, null, false, null);
     Assert.IsFalse(test.Cancelled, "Successful event args should not be cancelled");
 }
 public void Error_ForCancelledArgsFullConstructor_IsNull()
 {
     var test = new AsyncResultEventArgs<int>(0, null, true, null);
     Assert.IsNull(test.Error, "Cancelled event args should not preserve exception");
 }
 public void Error_ForSuccessfulArgsFullConstructor_IsNull()
 {
     var test = new AsyncResultEventArgs<int>(13, null, false, null);
     Assert.IsNull(test.Error, "Successful event args should not preserve exception");
 }
        /// <summary>
        /// Called when a socket read completes. Parses the received data and calls <see cref="PacketArrived"/> if necessary.
        /// </summary>
        /// <param name="e">Argument object containing the number of bytes read.</param>
        /// <exception cref="System.IO.InvalidDataException">If the data received is not a packet.</exception>
        private void SocketReadCompleted(AsyncResultEventArgs<int> e)
        {
            // Pass along read errors verbatim
            if (e.Error != null)
            {
                if (PacketArrived != null)
                {
                    PacketArrived(new AsyncResultEventArgs<byte[]>(e.Error));
                }

                return;
            }

            // Get the number of bytes read into the buffer
            _bytesReceived += e.Result;

            // If we get a zero-length read, then that indicates the remote side graciously closed the connection
            if (e.Result == 0)
            {
                if (PacketArrived != null)
                {
                    PacketArrived(new AsyncResultEventArgs<byte[]>((byte[])null));
                }
                return;
            }

            // Loop thorugh received transactions and split them into Modbus responses, calling client OnResponseData for each
            int resultptr = 0;
            while (resultptr < e.Result)
            {
                byte[] data;
                ushort id = SwapUInt16(BitConverter.ToUInt16(_tcpAsyClBuffer, resultptr));
                byte unit = _tcpAsyClBuffer[resultptr + 6];
                byte function = _tcpAsyClBuffer[resultptr + 7];

                switch (function)
                {
                    // Text Read data - always 128 bytes + 12 byte header
                    case 65:
                        data = new byte[128];
                        Array.Copy(_tcpAsyClBuffer, resultptr + 12, data, 0, 128);
                        resultptr = resultptr + 140;
                        break;
                    case 1:
                        data = new byte[_tcpAsyClBuffer[resultptr + 5] + 6];
                        Array.Copy(_tcpAsyClBuffer, resultptr, data, 0, _tcpAsyClBuffer[resultptr + 5] + 6);
                        resultptr = resultptr + _tcpAsyClBuffer[resultptr + 5] + 6;
                        break;

                        //data = new byte[1];
                        //Array.Copy(_tcpAsyClBuffer, resultptr + 9, data, 0, 1);
                        //resultptr = resultptr + 10;
                        //break;
                    case 3:
                        //00 01 00 00 00 06 01 03 00 20 00 01
                        //00 01 00 00 00 06 01 03 1B B1 00 01
                        data = new byte[_tcpAsyClBuffer[resultptr + 5] + 6];
                        Array.Copy(_tcpAsyClBuffer, resultptr, data, 0, _tcpAsyClBuffer[resultptr + 5] + 6);
                        resultptr = resultptr + _tcpAsyClBuffer[resultptr + 5] + 6;
                        break;

                        //data = new byte[tcpAsyClBuffer[resultptr + 8]];
                        //Array.Copy(tcpAsyClBuffer, resultptr + 9, data, 0, tcpAsyClBuffer[resultptr + 8]);
                        //resultptr = resultptr + 9 + tcpAsyClBuffer[resultptr + 8];
                        //break;

                    default:
                    // Any other write operation returns address written to
                        data = new byte[2];
                        Array.Copy(_tcpAsyClBuffer, resultptr + 10, data, 0, 2);
                        resultptr = resultptr + 10;
                        break;
                }
                if (PacketArrived != null)
                {
                    PacketArrived(new AsyncResultEventArgs<byte[]>(data));
                }
            }
            _bytesReceived = 0;
            ContinueReading();
        }
 public void Exception_ForFailedArgs_IsPreserved()
 {
     Exception error = new Exception();
     var test = new AsyncResultEventArgs<int>(error);
     Assert.AreSame(error, test.Error, "Failed event args did not preserve exception");
 }
 public void UserState_ForFailedArgsFullConstructor_IsPreserved()
 {
     object state = new object();
     var test = new AsyncResultEventArgs<int>(0, new Exception(), false, state);
     Assert.AreSame(state, test.UserState, "Failed event args did not preserve user state");
 }
 public void Exception_ForFailedArgsFullConstructor_IsPreserved()
 {
     Exception error = new Exception();
     var test = new AsyncResultEventArgs<int>(0, error, false, null);
     Assert.AreSame(error, test.Error, "Failed event args did not preserve exception");
 }
Beispiel #37
0
        public void ReadingResult_ForFailedArgsFullConstructor_ThrowsTargetInvocationException()
        {
            var test = new AsyncResultEventArgs <int>(0, new Exception(), false, null);

            Trace.WriteLine(test.Result);
        }
Beispiel #38
0
        public void CancelledProperty_ForFailedArgsFullConstructor_IsFalse()
        {
            var test = new AsyncResultEventArgs <int>(0, new Exception(), false, null);

            Assert.IsFalse(test.Cancelled, "Failed event args should not be cancelled");
        }
Beispiel #39
0
        public void Error_ForCancelledArgsFullConstructor_IsNull()
        {
            var test = new AsyncResultEventArgs <int>(0, null, true, null);

            Assert.IsNull(test.Error, "Cancelled event args should not preserve exception");
        }
 public void UserState_ForSuccessfulArgsFullConstructor_IsPreserved()
 {
     object state = new object();
     var test = new AsyncResultEventArgs<int>(13, null, false, state);
     Assert.AreSame(state, test.UserState, "Successful event args did not preserve user state");
 }
 public void ReadingResult_ForCancelledArgsFullConstructor_ThrowsInvalidOperationException()
 {
     var test = new AsyncResultEventArgs<int>(0, null, true, null);
     Trace.WriteLine(test.Result);
 }
Beispiel #42
0
        public void ReadingResult_ForFailedArgs_ThrowsTargetInvocationException()
        {
            var test = new AsyncResultEventArgs <int>(new Exception());

            Trace.WriteLine(test.Result);
        }
 public void CancelledProperty_ForFailedArgs_IsFalse()
 {
     var test = new AsyncResultEventArgs<int>(new Exception());
     Assert.IsFalse(test.Cancelled, "Failed event args should not be cancelled");
 }
Beispiel #44
0
        public void CancelledProperty_ForCancelledArgsFullConstructor_IsTrue()
        {
            var test = new AsyncResultEventArgs <int>(0, null, true, null);

            Assert.IsTrue(test.Cancelled, "Cancelled event args should be cancelled");
        }
Beispiel #45
0
        public void CancelledProperty_ForSuccessfulArgsFullConstructor_IsFalse()
        {
            var test = new AsyncResultEventArgs <int>(13, null, false, null);

            Assert.IsFalse(test.Cancelled, "Successful event args should not be cancelled");
        }
 public void UserState_ForCancelledArgsFullConstructor_IsPreserved()
 {
     object state = new object();
     var test = new AsyncResultEventArgs<int>(0, null, true, state);
     Assert.AreSame(state, test.UserState, "Cancelled event args did not preserve user state");
 }
Beispiel #47
0
        public void Error_ForSuccessfulArgs_IsNull()
        {
            var test = new AsyncResultEventArgs <int>(13);

            Assert.IsNull(test.Error, "Successful event args should not preserve exception");
        }
Beispiel #48
0
        private void ClientSocket_PacketArrived(AsyncResultEventArgs<byte[]> e)
        {
            try
            {
                // Check for errors
                if (e.Error != null)
                {
                    ResetSocket();
                    Console.WriteLine("Socket error during Read: [" + e.Error.GetType().Name + "] " + e.Error.Message);
                }
                else if (e.Result == null)
                {
                    // PacketArrived completes with a null packet when the other side gracefully closes the connection
                    Console.WriteLine("Socket graceful close detected");

                    // Close the socket and handle the state transition to disconnected.
                    ResetSocket();
                }
                else
                {
                    // At this point, we know we actually got a message.

                    // Deserialize the message
                    object message = SerializationHelper.Deserialize(e.Result);

                    if(HandleMessages(message) == false)
                    {
                        Console.WriteLine("Socket read got an unknown message of type " + message.GetType().Name);
                    }
                }
            }
            catch (Exception ex)
            {
                ResetSocket();
                Console.WriteLine("Error reading from socket: [" + ex.GetType().Name + "] " + ex.Message);
            }
            finally
            {
                RefreshDisplay();
            }
        }
Beispiel #49
0
        public void Error_ForSuccessfulArgsFullConstructor_IsNull()
        {
            var test = new AsyncResultEventArgs <int>(13, null, false, null);

            Assert.IsNull(test.Error, "Successful event args should not preserve exception");
        }
Beispiel #50
0
 /// <summary>
 /// Handles the <see cref="ServerTcpSocket.AcceptCompleted"/> event by restarting the accept operation and notifying the user of a listen
 /// operation completion.
 /// </summary>
 /// <param name="e">The results of the accept operation.</param>
 private void SocketAcceptCompleted(AsyncResultEventArgs<ServerChildTcpSocket> e)
 {
     Socket.AcceptAsync();
     if (ConnectionArrived != null)
         ConnectionArrived(ConvertArgs(e));
 }
 public void CancelledProperty_ForFailedArgsFullConstructor_IsFalse()
 {
     var test = new AsyncResultEventArgs<int>(0, new Exception(), false, null);
     Assert.IsFalse(test.Cancelled, "Failed event args should not be cancelled");
 }
 public void ReadingResult_ForFailedArgs_ThrowsTargetInvocationException()
 {
     var test = new AsyncResultEventArgs<int>(new Exception());
     Trace.WriteLine(test.Result);
 }
Beispiel #53
0
        public void CancelledProperty_ForFailedArgs_IsFalse()
        {
            var test = new AsyncResultEventArgs <int>(new Exception());

            Assert.IsFalse(test.Cancelled, "Failed event args should not be cancelled");
        }
Beispiel #54
0
        /// <summary>
        /// Called when a socket read completes. Parses the received data and calls <see cref="PacketArrived"/> if necessary.
        /// </summary>
        /// <param name="e">Argument object containing the number of bytes read.</param>
        /// <exception cref="System.IO.InvalidDataException">If the data received is not a packet.</exception>
        private void SocketReadCompleted(AsyncResultEventArgs <int> e)
        {
            // Pass along read errors verbatim
            if (e.Error != null)
            {
                if (this.PacketArrived != null)
                {
                    this.PacketArrived(new AsyncResultEventArgs <byte[]>(e.Error));
                }

                return;
            }

            // Get the number of bytes read into the buffer
            this.bytesReceived += e.Result;

            // If we get a zero-length read, then that indicates the remote side graciously closed the connection
            if (e.Result == 0)
            {
                if (this.PacketArrived != null)
                {
                    this.PacketArrived(new AsyncResultEventArgs <byte[]>((byte[])null));
                }

                return;
            }

            if (this.dataBuffer == null)
            {
                // (We're currently receiving the length buffer)
                if (this.bytesReceived != sizeof(int))
                {
                    // We haven't gotten all the length buffer yet
                    this.ContinueReading();
                }
                else
                {
                    // We've gotten the length buffer
                    int length = BitConverter.ToInt32(this.lengthBuffer, 0);

                    // Sanity check for length < 0
                    //  This check will catch 50% of transmission errors that make it past both the IP and Ethernet checksums
                    if (length < 0)
                    {
                        if (this.PacketArrived != null)
                        {
                            this.PacketArrived(new AsyncResultEventArgs <byte[]>(new System.IO.InvalidDataException("Packet length less than zero (corrupted message)")));
                        }

                        return;
                    }

                    // Zero-length packets are allowed as keepalives
                    if (length == 0)
                    {
                        this.bytesReceived = 0;
                        this.ContinueReading();
                    }
                    else
                    {
                        // Create the data buffer and start reading into it
                        this.dataBuffer    = new byte[length];
                        this.bytesReceived = 0;
                        this.ContinueReading();
                    }
                }
            }
            else
            {
                if (this.bytesReceived != this.dataBuffer.Length)
                {
                    // We haven't gotten all the data buffer yet
                    this.ContinueReading();
                }
                else
                {
                    // We've gotten an entire packet
                    if (this.PacketArrived != null)
                    {
                        this.PacketArrived(new AsyncResultEventArgs <byte[]>(this.dataBuffer));
                    }

                    // Start reading the length buffer again
                    this.dataBuffer    = null;
                    this.bytesReceived = 0;
                    this.ContinueReading();
                }
            }
        }
Beispiel #55
0
        public void Result_ForSuccessfulArgs_IsPreserved()
        {
            var test = new AsyncResultEventArgs <int>(13);

            Assert.AreEqual(13, test.Result, "Successful event args did not preserve result");
        }
Beispiel #56
0
        private void ParsePacket(AsyncResultEventArgs<byte[]> args)
        {
            try
            {
                if (args.Error != null)
                    throw args.Error;

                if (args.Result == null)
                {
                    if (Habbo.LoggedIn)
                        Habbo.LoggedIn = false;
                    Disconnect("Socket read error!");
                    return;
                }

                ParseByteData(args.Result);
            }
            catch (Exception)
            {
                if (args.Error != null)
                {
                    CoreManager.ServerCore.StandardOut.Error("Game Socket Manager", CoreManager.ServerCore.StringLocale.GetString("CORE:ERROR_NETWORK_CONNECTION_KILLED"));
                    Console.WriteLine();
                    Console.WriteLine(args.Error.Message);
                    Console.WriteLine(args.Error.StackTrace);
                }
            }
        }
 public void Error_ForSuccessfulArgs_IsNull()
 {
     var test = new AsyncResultEventArgs<int>(13);
     Assert.IsNull(test.Error, "Successful event args should not preserve exception");
 }
        /// <summary>
        /// Called when a socket read completes. Parses the received data and calls <see cref="PacketArrived"/> if necessary.
        /// </summary>
        /// <param name="e">Argument object containing the number of bytes read.</param>
        /// <exception cref="System.IO.InvalidDataException">If the data received is not a packet.</exception>
        private void SocketReadCompleted(AsyncResultEventArgs<int> e)
        {
            // Pass along read errors verbatim
            if (e.Error != null)
            {
                if (PacketArrived != null)
                {
                    PacketArrived(new AsyncResultEventArgs<byte[]>(e.Error));
                }

                return;
            }

            // Get the number of bytes read into the buffer
            bytesReceived += e.Result;

            // If we get a zero-length read, then that indicates the remote side graciously closed the connection
            if (e.Result == 0)
            {
                if (PacketArrived != null)
                {
                    PacketArrived(new AsyncResultEventArgs<byte[]>((byte[])null));
                }

                return;
            }

            if (dataBuffer == null)
            {
                // (We're currently receiving the length buffer)
                if (bytesReceived != sizeof(int))
                {
                    // We haven't gotten all the length buffer yet
                    ContinueReading();
                }
                else
                {
                    // We've gotten the length buffer
                    int length = BitConverter.ToInt32(lengthBuffer, 0);

                    // Sanity check for length < 0
                    //  This check will catch 50% of transmission errors that make it past both the IP and Ethernet checksums
                    if (length < 0)
                    {
                        if (PacketArrived != null)
                        {
                            PacketArrived(new AsyncResultEventArgs<byte[]>(new InvalidDataException("Packet length less than zero (corrupted message)")));
                        }

                        return;
                    }

                    // Zero-length packets are allowed as keepalives
                    if (length == 0)
                    {
                        bytesReceived = 0;
                        ContinueReading();
                    }
                    else
                    {
                        // Create the data buffer and start reading into it
                        dataBuffer = new byte[length];
                        bytesReceived = 0;
                        ContinueReading();
                    }
                }
            }
            else
            {
                if (bytesReceived != dataBuffer.Length)
                {
                    // We haven't gotten all the data buffer yet
                    ContinueReading();
                }
                else
                {
                    // We've gotten an entire packet
                    if (PacketArrived != null)
                    {
                        PacketArrived(new AsyncResultEventArgs<byte[]>(dataBuffer));
                    }

                    // Start reading the length buffer again
                    dataBuffer = null;
                    bytesReceived = 0;
                    ContinueReading();
                }
            }
        }
Beispiel #59
0
        private void SocketReadCompleted(AsyncResultEventArgs<int> args)
        {
            if (args.Error != null)
            {
                if (PacketArrived != null)
                    PacketArrived.Invoke(new AsyncResultEventArgs<byte[]>(args.Error));

                return;
            }

            _bytesReceived += args.Result;

            if (args.Result == 0)
            {
                if (PacketArrived != null)
                    PacketArrived.Invoke(new AsyncResultEventArgs<byte[]>(null as byte[]));
                return;
            }

            if (_dataBuffer == null)
            {
                if (_bytesReceived != Protocol.Reader.LengthBytes)
                {
                    ContinueReading();
                }
                else
                {
                    int length = Protocol.Reader.ParseLength(_lengthBuffer);

                    _dataBuffer = new byte[length];
                    _bytesReceived = 0;
                    ContinueReading();
                }
            }
            else
            {
                if (_bytesReceived != _dataBuffer.Length)
                {
                    ContinueReading();
                }
                else
                {
                    if (PacketArrived != null)
                        PacketArrived.Invoke(new AsyncResultEventArgs<byte[]>(_dataBuffer));

                    _dataBuffer = null;
                    _bytesReceived = 0;
                    ContinueReading();
                }
            }
        }