Example #1
0
 /// <summary>
 /// Method responsible for execute the callback of message received from client in server.
 /// </summary>
 /// <param name="client">The connected client.</param>
 /// <param name="kingBuffer">The king buffer received from message.</param>
 private void OnMessageReceived(IClient client, IKingBufferReader reader)
 {
     try
     {
         if (reader.Length > 0 && _serverPacketHandlers.Count > 0 && _serverPacketHandlers.TryGetValue(reader.ReadByte(), out var serverHandler))
         {
             serverHandler(client, reader);
         }
         else
         {
             OnMessageReceivedHandler?.Invoke(client, reader);
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine($"Error: {ex.Message}.");
     }
 }
Example #2
0
        /// <summary>
        /// This method waits for data to come in from the TCP socket. It recursively loops until
        /// the specified amount of data is received, after which it will call the callback
        /// delegate that is supplied.
        /// </summary>
        /// <param name="incomingMessageBuffer">
        /// The message buffer to copy the received message to</param>
        /// <param name="bufferOffset">
        /// The offset into the incoming TCP message stream to start reading data from</param>
        /// <param name="numberOfBytesToRead">
        /// The number of bytes to read before exiting the loop</param>
        /// <param name="messageReceivedCallback">
        /// Callback that runs once all the data has been received</param>
        /// <returns></returns>
        private bool MessageReceiverLoop(
            byte[] incomingMessageBuffer,
            int bufferOffset,
            uint numberOfBytesToRead,
            OnMessageReceivedHandler messageReceivedCallback)
        {
            //
            // Check and protect against bad parameters
            //

            if (incomingMessageBuffer == null ||
                numberOfBytesToRead > incomingMessageBuffer.Length ||
                bufferOffset >= incomingMessageBuffer.Length)
            {
                return(false);
            }

            if (numberOfBytesToRead == 0)
            {
                if (messageReceivedCallback != null)
                {
                    messageReceivedCallback(this, incomingMessageBuffer);
                }
                return(true);
            }

            try
            {
                _socket.BeginReceive(
                    incomingMessageBuffer,
                    bufferOffset,
                    incomingMessageBuffer.Length - bufferOffset,
                    SocketFlags.None,
                    aResult =>
                {
                    //
                    // Callback once data is received through the socket.
                    //

                    //ToDo: Determine if we need to re-enable this code.
                    // Possible that our socket instance has changed between BeginReceive and EndReceive.
                    //int? thisSocketID = aResult.AsyncState as int?;
                    //if (!thisSocketID.HasValue || thisSocketID.Value != _socketID)
                    //{
                    //    ReceiveAsync();
                    //    return;
                    //}

                    try
                    {
                        int bytesReceived = _socket.EndReceive(aResult);

                        if (bytesReceived == 0 && !IsConnected)
                        {
                            Disconnect();
                            return;
                        }


                        //
                        // If all the bytes that are being waited on have been received,
                        // execute the callback.  Otherwise, recursively call this method
                        // again and wait to receive more data.
                        //

                        int receiveCount = bytesReceived;
                        if (receiveCount >= numberOfBytesToRead)
                        {
                            if (messageReceivedCallback != null)
                            {
                                messageReceivedCallback(this, incomingMessageBuffer);
                            }
                        }
                        else
                        {
                            MessageReceiverLoop(
                                incomingMessageBuffer,
                                receiveCount,
                                numberOfBytesToRead,
                                messageReceivedCallback);
                        }
                    }
                    catch (SocketException)
                    {
                        if (!IsConnected)
                        {
                            Disconnect();
                            return;
                        }

                        Trace.WriteLine(string.Format("TCPReceiveLoop: Client {0} has closed the connection.", UserInfo.EmailAddress));
                    }
                    catch (Exception e)
                    {
#if DEBUG
                        //throw;
#endif
                        if (!IsConnected)
                        {
                            Disconnect();
                            return;
                        }

                        Trace.WriteLine(string.Format("TCPReceiveLoop: Caught exception!! '{0}'\n{1}", e.Message, e.StackTrace));
                    }
                },
                    _socketId); // ToDo: Determine what the point of this object is.
            }
            catch (Exception e)
            {
                if (!IsConnected)
                {
                    Disconnect();
                    return(false);
                }

                Trace.WriteLine(string.Format("TCPReceiveLoop: Caught exception!! '{0}'\n{1}", e.Message, e.StackTrace));
                return(false);
            }

            return(true);
        }
Example #3
0
        /// <summary>
        /// This method waits for data to come in from the TCP socket. It recursively loops until
        /// the specified amount of data is received, after which it will call the callback
        /// delegate that is supplied.
        /// </summary>
        /// <param name="incomingMessageBuffer">
        /// The message buffer to copy the received message to</param>
        /// <param name="bufferOffset">
        /// The offset into the incoming TCP message stream to start reading data from</param>
        /// <param name="numberOfBytesToRead">
        /// The number of bytes to read before exiting the loop</param>
        /// <param name="messageReceivedCallback">
        /// Callback that runs once all the data has been received</param>
        /// <returns></returns>
        private bool MessageReceiverLoop(
            byte[] incomingMessageBuffer,
            int bufferOffset,
            uint numberOfBytesToRead,
            OnMessageReceivedHandler messageReceivedCallback)
        {
            //
            // Check and protect against bad parameters
            //

            if (incomingMessageBuffer == null ||
                numberOfBytesToRead > incomingMessageBuffer.Length ||
                bufferOffset >= incomingMessageBuffer.Length)
            {
                return false;
            }

            if (numberOfBytesToRead == 0)
            {
                if (messageReceivedCallback != null)
                {
                    messageReceivedCallback(this, incomingMessageBuffer);
                }
                return true;
            }

            try
            {
                _socket.BeginReceive(
                    incomingMessageBuffer,
                    bufferOffset,
                    incomingMessageBuffer.Length - bufferOffset,
                    SocketFlags.None,
                    aResult =>
                    {
                        //
                        // Callback once data is received through the socket.
                        //

                        //ToDo: Determine if we need to re-enable this code.
                        // Possible that our socket instance has changed between BeginReceive and EndReceive.
                        //int? thisSocketID = aResult.AsyncState as int?;
                        //if (!thisSocketID.HasValue || thisSocketID.Value != _socketID)
                        //{
                        //    ReceiveAsync();
                        //    return;
                        //}

                        try
                        {
                            int bytesReceived = _socket.EndReceive(aResult);

                            if (bytesReceived == 0 && !IsConnected)
                            {
                                Disconnect();
                                return;
                            }

                            //
                            // If all the bytes that are being waited on have been received,
                            // execute the callback.  Otherwise, recursively call this method
                            // again and wait to receive more data.
                            //

                            int receiveCount = bytesReceived;
                            if (receiveCount >= numberOfBytesToRead)
                            {
                                if (messageReceivedCallback != null)
                                {
                                    messageReceivedCallback(this, incomingMessageBuffer);
                                }
                            }
                            else
                            {
                                MessageReceiverLoop(
                                        incomingMessageBuffer,
                                        receiveCount,
                                        numberOfBytesToRead,
                                        messageReceivedCallback);
                            }
                        }
                        catch (SocketException)
                        {
                            if (!IsConnected)
                            {
                                Disconnect();
                                return;
                            }

                            Trace.WriteLine(string.Format("TCPReceiveLoop: Client {0} has closed the connection.", UserInfo.EmailAddress));
                        }
                        catch (Exception e)
                        {
            #if DEBUG
                            //throw;
            #endif
                            if (!IsConnected)
                            {
                                Disconnect();
                                return;
                            }

                            Trace.WriteLine(string.Format("TCPReceiveLoop: Caught exception!! '{0}'\n{1}", e.Message, e.StackTrace));
                        }
                    },
                    _socketId); // ToDo: Determine what the point of this object is.
            }
            catch (Exception e)
            {
                if (!IsConnected)
                {
                    Disconnect();
                    return false;
                }

                Trace.WriteLine(string.Format("TCPReceiveLoop: Caught exception!! '{0}'\n{1}", e.Message, e.StackTrace));
                return false;
            }

            return true;
        }