private void ProcessReceiveQueue()
 {
     Log(LogLevel.Info, "Receive queue started");
     while (_isStarted)
     {
         CommunicationMessage message = null;
         try
         {
             lock (_receiveQueue.SyncRoot)
             {
                 if (_isStarted && _receiveQueue.Count > 0)
                 {
                     message = _receiveQueue.Dequeue() as CommunicationMessage;
                 }
             }
             if (message != null)
             {
                 Log(LogLevel.Info, "Dequeued message.                  Length: " + message.Data.Length.ToString().PadLeft(5));
                 if (DataReceived != null)
                 {
                     DataReceived(this, new DataReceivedEventArgs(message));
                 }
             }
         }
         catch (Exception exception)
         {
             LogException(exception);
         }
         Thread.Sleep(10);
     }
     Log(LogLevel.Info, "Receive queue stopped");
 }
 private void OnDataReceived(CommunicationMessage message)
 {
     if (DataReceived != null)
     {
         DataReceived(this, new DataReceivedEventArgs(message));
     }
 }
 public void Enqueue(CommunicationMessage message)
 {
     if (_isStarted && message != null && message.Data != null)
     {
         lock (_sendQueue.SyncRoot)
         {
             _sendQueue.Enqueue(message);
         }
         Log(LogLevel.Info, "Enqueued message.                  Length: " + message.Data.Length.ToString().PadLeft(5));
     }
 }
Пример #4
0
 private void AddToMessageList(CommunicationMessage message)
 {
     lock (_messageQueue.SyncRoot)
     {
         if (_messageQueue.Count > 5000)
         {
             _messageQueue.Clear();
         }
         _messageQueue.Enqueue(message);
     }
 }
Пример #5
0
 public void NotifyAll(MessageType messageType, DateTime dateTime, string teamId, string category, string text)
 {
     StringBuilder sb = new StringBuilder();
     sb.Append("<Message><MessageType>");
     sb.Append(messageType.ToString());
     sb.Append("</MessageType>");
     sb.Append("<DateTime>");
     sb.Append(dateTime.ToString("HH:mm:ss"));
     sb.Append("</DateTime>");
     sb.Append("<TeamId>");
     sb.Append(teamId);
     sb.Append("</TeamId>");
     sb.Append("<Category>");
     sb.Append(category);
     sb.Append("</Category><Text>");
     sb.Append(System.Security.SecurityElement.Escape(text) + "</Text><Forward>1</Forward><Synchronized>0</Synchronized></Message>");
     CommunicationMessage message = new CommunicationMessage(sb.ToString());
     AddToMessageList(message);
     message.ToAll = true;
     _server.Enqueue(message);
 }
Пример #6
0
 public DataReceivedEventArgs(CommunicationMessage communicationMessage)
 {
     _message = communicationMessage;
 }
        private void ProcessSendQueue()
        {
            Log(LogLevel.Info, "Send queue started");

            IPEndPoint remoteIPEndPoint = null;
            IPAddress  ipAddress        = IPAddress.Parse(_multicastIPAddress);

            if (ipAddress != null)
            {
                remoteIPEndPoint = new IPEndPoint(ipAddress, _multicastPort);
            }

            while (_isStarted)
            {
                CommunicationMessage message = null;
                lock (_sendQueue.SyncRoot)
                {
                    if (_isStarted && _sendQueue.Count > 0)
                    {
                        message = _sendQueue.Dequeue() as CommunicationMessage;
                    }
                }
                if (message != null)
                {
                    Log(LogLevel.Info, "Begin sending data.                Length: " + message.Data.Length.ToString().PadLeft(5));
                    char[]   dataToSend = message.Data.ToCharArray();
                    Encoding encoding   = Encoding.UTF8;
                    byte[]   buffer     = encoding.GetBytes(dataToSend, 0, dataToSend.Length);

                    if (_logLevel >= LogLevel.Full)
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.Append("Data to send.                      Length: " + dataToSend.Length.ToString().PadLeft(5) + " (" + buffer.Length.ToString().PadLeft(5) + " bytes)");
                        sb.Append(Environment.NewLine);
                        sb.Append("[begin]");
                        sb.Append(Environment.NewLine);
                        sb.Append(message.Data);
                        sb.Append(Environment.NewLine);
                        sb.Append("[end]");
                        Log(LogLevel.Full, sb.ToString());
                    }
                    else
                    {
                        Log(LogLevel.Info, "Data to send.                      Length: " + dataToSend.Length.ToString().PadLeft(5) + " (" + buffer.Length.ToString().PadLeft(5) + " bytes)");
                    }

                    if (message.ToAll || message.IsMulticast)
                    {
                        if (remoteIPEndPoint != null)
                        {
                            Log(LogLevel.Info, "Sending data via multicast");
                            _multicastSocket.SendTo(buffer, remoteIPEndPoint);
                            Log(LogLevel.Info, "End sending data                   Length: " + dataToSend.Length.ToString().PadLeft(5) + " (" + buffer.Length.ToString().PadLeft(5) + " bytes) via Multicast");
                        }
                    }

                    int i = 0;
                    int nrOfRecipients = 0;         // Just displayed in the logfile
                    while (i < _socketList.Count)
                    {
                        Socket     socket     = _socketList[i];
                        IPEndPoint ipEndPoint = socket.RemoteEndPoint as IPEndPoint;
                        if (ipEndPoint != null)
                        {
                            try
                            {
                                socket.Send(buffer);
                                nrOfRecipients++;
                            }
                            catch (SocketException)
                            {
                                CloseSocket(ref socket);
                                _socketList.RemoveAt(i);
                                i--;
                                if (ClientDisconnected != null)
                                {
                                    ClientDisconnected.BeginInvoke(this, new ClientConnectionEventArgs(ipEndPoint), null, null);
                                }
                            }
                            i++;
                        }
                    }
                    Log(LogLevel.Info, "End sending data.                  Length: " + dataToSend.Length.ToString().PadLeft(5) + " (" + buffer.Length.ToString().PadLeft(5) + " bytes) to " + nrOfRecipients.ToString().PadLeft(2) + "/" + _socketList.Count + " recipients");
                }
                Thread.Sleep(10);
            }
            Log(LogLevel.Info, "Send queue stopped");
        }
        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");
        }
Пример #9
0
 public void Enqueue(CommunicationMessage message)
 {
     if (_isStarted && message != null && message.Data != null)
     {
         lock (_sendQueue.SyncRoot)
         {
             _sendQueue.Enqueue(message);
         }
         Log(LogLevel.Info, "Enqueued message.                  Length: " + message.Data.Length.ToString().PadLeft(5));
     }
 }
Пример #10
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");
        }
Пример #11
0
 private void SendMessageList(string teamId, bool useMulticast)
 {
     object[] messages;
     lock (_messageQueue.SyncRoot)
     {
         messages = _messageQueue.ToArray();
     }
     List<CommunicationMessage> messagesToSend = new List<CommunicationMessage>();
     int numberSend = 0;
     for (int i = messages.Length - 1; i >= 0; i--)
     {
         CommunicationMessage message = (CommunicationMessage)messages[i];
         if (string.IsNullOrEmpty(message.GetTeamId()) || message.GetTeamId().Equals(teamId, StringComparison.OrdinalIgnoreCase))
         {
             CommunicationMessage newMessage = new CommunicationMessage(message.Data);
             newMessage.SetTeamId(teamId);
             newMessage.IsMulticast = useMulticast;
             newMessage.SetSynchronizedFlag();
             messagesToSend.Add(newMessage);
             numberSend++;
             if (numberSend >= 50)
             {
                 break;
             }
         }
     }
     for (int i = messagesToSend.Count-1; i >= 0 ; i--)
     {
         _server.Enqueue(messagesToSend[i]);
     }
 }
Пример #12
0
 public DataReceivedEventArgs(CommunicationMessage communicationMessage)
 {
     _message = communicationMessage;
 }
        private void ProcessSendQueue()
        {
            Log(LogLevel.Info, "Send queue started");

            IPEndPoint remoteIPEndPoint = null;
            IPAddress  ipAddress        = IPAddress.Parse(_multicastIPAddress);

            if (ipAddress != null)
            {
                remoteIPEndPoint = new IPEndPoint(ipAddress, _multicastPort);
            }

            while (_isStarted)
            {
                try
                {
                    CommunicationMessage message = null;
                    lock (_sendQueue.SyncRoot)
                    {
                        if (_isStarted && _sendQueue.Count > 0)
                        {
                            message = _sendQueue.Dequeue() as CommunicationMessage;
                        }
                    }
                    if (message != null)
                    {
                        Log(LogLevel.Info, "Begin sending data.                        Length: " + message.Data.Length.ToString().PadLeft(5));
                        char[] dataToSend = message.Data.ToCharArray();

                        Encoding encoding = Encoding.UTF8;
                        byte[]   buffer   = encoding.GetBytes(dataToSend, 0, dataToSend.Length);

                        if (_logLevel >= LogLevel.Full)
                        {
                            StringBuilder sb = new StringBuilder();
                            sb.Append("Data to send.                              Length: " + dataToSend.Length.ToString().PadLeft(5) + " (" + buffer.Length.ToString().PadLeft(5) + " bytes)");
                            sb.Append(Environment.NewLine);
                            sb.Append("[begin]");
                            sb.Append(Environment.NewLine);
                            sb.Append(message.Data);
                            sb.Append(Environment.NewLine);
                            sb.Append("[end]");
                            Log(LogLevel.Full, sb.ToString());
                        }

                        if (_useMulticast)
                        {
                            if (remoteIPEndPoint != null)
                            {
                                Log(LogLevel.Info, "Sending data via multicast");
                                _multicastSocket.SendTo(buffer, remoteIPEndPoint);
                                Log(LogLevel.Info, "End sending data                   Length: " + dataToSend.Length.ToString().PadLeft(5) + " (" + buffer.Length.ToString().PadLeft(5) + " bytes) via Multicast");
                            }
                        }
                        else
                        {
                            if (_socket != null && _socket.Connected)
                            {
                                Log(LogLevel.Info, "Sending data via socket");
                                _socket.Send(buffer);
                                Log(LogLevel.Info, "End sending data.                          Length: " + dataToSend.Length.ToString().PadLeft(5) + " (" + buffer.Length.ToString().PadLeft(5) + " bytes)");
                            }
                        }
                    }
                }
                catch (SocketException socketException)
                {
                    LogException(socketException);
                    OnSendError(socketException);
                }
                catch (Exception exception)
                {
                    LogException(exception);
                }
                Thread.Sleep(10);
            }
            Log(LogLevel.Info, "Send queue stopped");
        }