// ------------------------------------------------------------------------------------------ /// <summary> Funkcja wysyłająca wiadomość do określonego podłączonego. </summary> /// <param name="client"> Podłączony klient. </param> /// <param name="message"> Wiadomość wysyłana do klienta. </param> private void SendMessage(ClientData client, Message message) { Socket socket = client.Socket; // Szyfrowanie wiadomości do wsyłania if (client.Encrypted) { ICrypt encryptionServices = null; switch (client.CryptType) { case CryptType.RSA: encryptionServices = encryptionServicesRSA; break; case CryptType.ElGamal: encryptionServices = encryptionServicesElGamal; break; } message.Encrypt(encryptionServices, client.Key); } byte[] buffer = Encoding.ASCII.GetBytes(message.ToString()); Console.Write(message.ToString()); AsyncCallback sender = new AsyncCallback(SendCallback); socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, sender, client); client.BeginReciveMessages(); }
// ########################################################################################## /// <summary> Funkcja przyłączająca klienta do serwera. </summary> /// <param name="asyncResult"> Podłączany klient. </param> private void AcceptClient(IAsyncResult asyncResult) { if (srvClients == null) { srvClients = new List <ClientData>(); } try { Socket socket = srvSocket.EndAccept(asyncResult); AsyncCallback reciver = new AsyncCallback(ReciveCallback); ClientData client = new ClientData(socket, BufferSize, reciver); client.Identifier = srvIdCounter; client.Name = string.Format("Client {0}", srvIdCounter.ToString()); srvClients.Add(client); client.BeginReciveMessages(); UpdateUI("( i ) Registered new Client with ID: " + srvIdCounter.ToString()); UpdateUI(" and IPAddress: " + client.GetIPAddress()); } catch (NullReferenceException) { /* srvSocket is current NULL */ } catch (ObjectDisposedException) { /* srvSocket set to NULL */ } StartListen(); }
// ------------------------------------------------------------------------------------------ /// <summary> Funkcja odbierająca wiadomość od klienta. </summary> /// <param name="asyncResult"> Podłączony klient. </param> private void ReciveCallback(IAsyncResult asyncResult) { try { ClientData client = (ClientData)asyncResult.AsyncState; Socket socket = client.Socket; int bufferSize = socket.EndReceive(asyncResult); byte[] buffer = new byte[bufferSize]; if (bufferSize == 0) { LoopReconnect(asyncResult, client); return; } else { client.ReconnectAttempt = 0; } Array.Copy(client.Buffer, buffer, bufferSize); Message newMessage = Message.ReadMessage(Encoding.ASCII.GetString(buffer)); // Deszyfrowanie wiadomości po otrzymaniu. if (client.Encrypted) { ICrypt encryptionServices = null; switch (client.CryptType) { case CryptType.RSA: encryptionServices = encryptionServicesRSA; break; case CryptType.ElGamal: encryptionServices = encryptionServicesElGamal; break; } newMessage.Decrypt(encryptionServices, client.Encrypted); } bool executed = ExecuteClientCommand(newMessage, client); if (!executed) { int senderId = newMessage.senderId; int reciverId = newMessage.reciverId; string sendDate = newMessage.sendDate.ToString(); if (reciverId == 0) { UpdateUI(sendDate + " [ " + client.Name + " ] " + Environment.NewLine + newMessage.message); } else { SendMessage(GetClient(reciverId), newMessage); } } client.BeginReciveMessages(); } catch (NullReferenceException) { /* socket is currently NULL */ } catch (ObjectDisposedException) { /* socket is currently NULLable */ } catch (SocketException) { /* socket is currently Disconected */ } }