private void SendDatagram(IPEndPoint remoteEP, UdpState udpState, string timeStamp, DatagramTypes datagramType, string text) { try { StringBuilder sendMessage = new StringBuilder(); sendMessage.AppendLine(); sendMessage.AppendLine(timeStamp); sendMessage.AppendLine(localClientVersion); sendMessage.AppendLine(Enum.GetName(typeof(DatagramTypes), datagramType)); sendMessage.AppendLine(localUserKey); sendMessage.AppendLine(localAddress.ToString()); sendMessage.AppendLine(localUserName); int headerLength = sendMessage.Length; sendMessage.Insert(0, headerLength); sendMessage.AppendLine(text); byte[] cipherMessage = Security.EncryptString(sendMessage.ToString()); sendUdpClient.BeginSend(cipherMessage, cipherMessage.Length, remoteEP, SendCallback, udpState); } catch (Exception ex) { ErrorHandler.ShowError(ex); } }
private void RemoveQueryFromQueue(string key, DatagramTypes type) { try { // Lock the list for thread safety. lock (queryQueue) { List <PendingQuery> remList = new List <PendingQuery>(); foreach (PendingQuery status in queryQueue) { if (status.UserKey == key && status.Type == type) { remList.Add(status); } } // Remove all items that are common to both lists queryQueue.RemoveAll(new Predicate <PendingQuery>(delegate(PendingQuery item) { return(remList.Contains(item)); })); } } catch (Exception ex) { ErrorHandler.ShowError(ex); } }
public PendingQuery(string userKey, DatagramTypes type, string timeStamp, string userName, string text, int retries) { UserKey = userKey; Type = type; TimeStamp = timeStamp; UserName = userName; Text = text; Retries = retries; }
/// <summary> /// Add a query with pending acknowledgement to the query queue. /// </summary> /// <param name="key"></param> /// <param name="text"></param> private void AddQueryToQueue(string key, DatagramTypes type, string timeStamp, string userName, string text, int retries) { try { // Lock the list for thread safety. lock (queryQueue) { queryQueue.Add(new PendingQuery(key, type, timeStamp, userName, text, retries)); } } catch (Exception ex) { ErrorHandler.ShowError(ex); } }
private void SendBroadcast(DatagramTypes datagramType, string text) { try { string timeStamp = DateTime.UtcNow.ToBinary().ToString(); IPEndPoint remoteEP = new IPEndPoint(broadcastAddress, portNumber); if (sendUdpClient == null) { sendUdpClient = new UdpClient(); } UdpState udpState = new UdpState(remoteEP, sendUdpClient); SendDatagram(remoteEP, udpState, timeStamp, datagramType, text); } catch (Exception ex) { ErrorHandler.ShowError(ex); } }
private void SendMessage(DatagramTypes datagramType, string remoteUserKey, string text) { try { string timeStamp = DateTime.UtcNow.ToBinary().ToString(); User remoteUser = GetUser(remoteUserKey); // If user does not exist in user list, display a failure message. if (remoteUser == null) { if (datagramType == DatagramTypes.Message) { AddMessageToQueue(remoteUserKey, MessageTypes.Failed, timeStamp, localUserName, localAddress.ToString(), text); } return; } string remoteUserName = remoteUser.Name; IPAddress remoteAddress = IPAddress.Parse(remoteUser.Address); IPEndPoint remoteEP = new IPEndPoint(remoteAddress, portNumber); if (sendUdpClient == null) { sendUdpClient = new UdpClient(); } UdpState udpState = new UdpState(remoteEP, sendUdpClient); switch (datagramType) { case DatagramTypes.Message: AddQueryToQueue(remoteUserKey, DatagramTypes.Message, timeStamp, localUserName, text, 0); break; case DatagramTypes.File: string filePath = text; string key = System.Guid.NewGuid().ToString(); FileTransferInfo fileInfo = SendFile(key, remoteUserKey, remoteUserName, remoteAddress.ToString(), filePath); // Send message only if SendFile returned succesfully. if (fileInfo != null) { string fileName = fileInfo.FileName; string fileSize = fileInfo.FileSize; text = key + Environment.NewLine + fileName + Environment.NewLine + fileSize; } else { // Do not send the message. return; } break; case DatagramTypes.Query: int retries = int.Parse(text); AddQueryToQueue(remoteUserKey, DatagramTypes.Query, timeStamp, string.Empty, string.Empty, retries); break; case DatagramTypes.UserInfo: text = userInfo.LogonName + Environment.NewLine + userInfo.MachineName + Environment.NewLine + userInfo.IPAddress + Environment.NewLine + userInfo.OSName + Environment.NewLine + userInfo.MessengerVersion; break; } SendDatagram(remoteEP, udpState, timeStamp, datagramType, text); } catch (Exception ex) { ErrorHandler.ShowError(ex); } }
// Constructor. public ChatArgs(DatagramTypes datagramType, string key, string message) { this.datagramType = datagramType; this.key = key; this.message = message; }