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)); } }
private void AddToMessageList(CommunicationMessage message) { lock (_messageQueue.SyncRoot) { if (_messageQueue.Count > 5000) { _messageQueue.Clear(); } _messageQueue.Enqueue(message); } }
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); }
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"); }
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]); } }
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"); }