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");
        }
Esempio n. 2
0
        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");
        }