protected void handleReceive() { while (receiveHandleIndex < receiveIndex) { //Read header bytes if (currentMessageHeaderIndex < KLFCommon.MSG_HEADER_LENGTH) { //Determine how many header bytes can be read int bytes_to_read = Math.Min(receiveIndex - receiveHandleIndex, KLFCommon.MSG_HEADER_LENGTH - currentMessageHeaderIndex); //Read header bytes Array.Copy(receiveBuffer, receiveHandleIndex, currentMessageHeader, currentMessageHeaderIndex, bytes_to_read); //Advance buffer indices currentMessageHeaderIndex += bytes_to_read; receiveHandleIndex += bytes_to_read; //Handle header if (currentMessageHeaderIndex >= KLFCommon.MSG_HEADER_LENGTH) { int id_int = KLFCommon.intFromBytes(currentMessageHeader, 0); //Make sure the message id section of the header is a valid value if (id_int >= 0 && id_int < Enum.GetValues(typeof(KLFCommon.ServerMessageID)).Length) currentMessageID = (KLFCommon.ServerMessageID)id_int; else currentMessageID = KLFCommon.ServerMessageID.NULL; int data_length = KLFCommon.intFromBytes(currentMessageHeader, 4); if (data_length > 0) { //Init message data buffer currentMessageData = new byte[data_length]; currentMessageDataIndex = 0; } else { currentMessageData = null; //Handle received message messageReceived(currentMessageID, null); //Prepare for the next header read currentMessageHeaderIndex = 0; } } } if (currentMessageData != null) { //Read data bytes if (currentMessageDataIndex < currentMessageData.Length) { //Determine how many data bytes can be read int bytes_to_read = Math.Min(receiveIndex - receiveHandleIndex, currentMessageData.Length - currentMessageDataIndex); //Read data bytes Array.Copy(receiveBuffer, receiveHandleIndex, currentMessageData, currentMessageDataIndex, bytes_to_read); //Advance buffer indices currentMessageDataIndex += bytes_to_read; receiveHandleIndex += bytes_to_read; //Handle data if (currentMessageDataIndex >= currentMessageData.Length) { //Handle received message messageReceived(currentMessageID, currentMessageData); currentMessageData = null; //Prepare for the next header read currentMessageHeaderIndex = 0; } } } } //Once all receive bytes have been handled, reset buffer indices to use the whole buffer again receiveHandleIndex = 0; receiveIndex = 0; }
protected void HandleReceive() { while (ReceiveHandleIndex < ReceiveIndex) { //Read header bytes if (CurrentMessageHeaderIndex < KLFCommon.MessageHeaderLength) { //Determine how many header bytes can be read int bytesToRead = Math.Min(ReceiveIndex - ReceiveHandleIndex, KLFCommon.MessageHeaderLength - CurrentMessageHeaderIndex); //Read header bytes Array.Copy(ReceiveBuffer, ReceiveHandleIndex, CurrentMessageHeader, CurrentMessageHeaderIndex, bytesToRead); //Advance buffer indices CurrentMessageHeaderIndex += bytesToRead; ReceiveHandleIndex += bytesToRead; //Handle header if (CurrentMessageHeaderIndex >= KLFCommon.MessageHeaderLength) { int idInt = KLFCommon.BytesToInt(CurrentMessageHeader, 0); //Make sure the message id section of the header is a valid value if(idInt >= 0 && idInt < Enum.GetValues(typeof(KLFCommon.ServerMessageID)).Length) CurrentMessageID = (KLFCommon.ServerMessageID)idInt; else CurrentMessageID = KLFCommon.ServerMessageID.Null; int dataLength = KLFCommon.BytesToInt(CurrentMessageHeader, 4); if (dataLength > 0) { //Init message data buffer CurrentMessageData = new byte[dataLength]; CurrentMessageDataIndex = 0; } else { CurrentMessageData = null; MessageReceived(CurrentMessageID, null); CurrentMessageHeaderIndex = 0;//Prepare for the next header read } } } if (CurrentMessageData != null) { //Read data bytes if (CurrentMessageDataIndex < CurrentMessageData.Length) { //Determine how many data bytes can be read int bytesToRead = Math.Min(ReceiveIndex - ReceiveHandleIndex, CurrentMessageData.Length - CurrentMessageDataIndex); //Read data bytes Array.Copy(ReceiveBuffer, ReceiveHandleIndex, CurrentMessageData, CurrentMessageDataIndex, bytesToRead); //Advance buffer indices CurrentMessageDataIndex += bytesToRead; ReceiveHandleIndex += bytesToRead; //Handle data if (CurrentMessageDataIndex >= CurrentMessageData.Length) { //Handle received message MessageReceived(CurrentMessageID, CurrentMessageData); CurrentMessageData = null; //Prepare for the next header read CurrentMessageHeaderIndex = 0; } } } } //Once all receive bytes have been handled, reset buffer indices to use the whole buffer again ReceiveHandleIndex = 0; ReceiveIndex = 0; }