/// <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}."); } }
/// <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); }
/// <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; }