private void StartListeningMulticast() { Log(LogLevel.Info, "Listen thread multicast started"); string savedData = string.Empty; while (_isStarted) { try { int nrOfBytesAvailable = _multicastSocket.Available; if (nrOfBytesAvailable > 0) { byte[] buffer = new byte[nrOfBytesAvailable]; int received = _multicastSocket.Receive(buffer); if (_logLevel >= LogLevel.Full) { Log(LogLevel.Info, "Nr of bytes available: " + nrOfBytesAvailable + "; Nr of bytes for current datagram: " + received); } Encoding encoding = Encoding.UTF8; string data = encoding.GetString(buffer, 0, received); if (_logLevel >= LogLevel.Full) { StringBuilder sb = new StringBuilder(); sb.Append("Multicast Data received. Length: " + data.Length.ToString().PadLeft(5) + " (" + received.ToString().PadLeft(5) + " bytes)"); sb.Append(Environment.NewLine); sb.Append("[begin]"); sb.Append(Environment.NewLine); sb.Append(data); sb.Append(Environment.NewLine); sb.Append("[end]"); Log(LogLevel.Full, sb.ToString()); } else { Log(LogLevel.Info, "Multicast Data received. Length: " + data.Length.ToString().PadLeft(5) + " (" + received.ToString().PadLeft(5) + " bytes)"); } savedData += data; const string messageEnd = "</Message>"; // do we have a message? int indexOfEOM = savedData.IndexOf(messageEnd); while (indexOfEOM != -1) { int messageLength = indexOfEOM + messageEnd.Length; lock (_receiveQueue.SyncRoot) { string completeMessage = savedData.Substring(0, messageLength); CommunicationMessage message = new CommunicationMessage(completeMessage, true); if (!message.IsForward()) { _receiveQueue.Enqueue(message); } } if (savedData.Length > messageLength) { savedData = savedData.Substring(messageLength); indexOfEOM = savedData.IndexOf(messageEnd); } else { savedData = string.Empty; break; } } } } catch (SocketException socketException) { LogException(socketException); OnReceiveError(socketException); } catch (Exception exception) { LogException(exception); } Thread.Sleep(10); } Log(LogLevel.Info, "Listen thread multicast stopped"); }