/// <summary> /// Event when as sended a data /// </summary> /// <param name="clientIP">Client IP address</param> /// <param name="data">Data received</param> private void r_OnReceived(string clientIP, byte[] data) { lock (lockThis) { /*Disassemble data*/ List <DataReceived> listPackets = PacketDisassembler.Disassemble(data); /*Read each packets*/ for (int i = 0; i < listPackets.Count; i++) { DataReceived packet = listPackets[i]; Command cmd = (Command)BitConverter.ToInt32(data, 0); switch (cmd) { case Command.Init: Init dataInit = new Init(packet.data); Client client = new Client(clientIP, dataInit.nbrCore, dataInit.memoryUsed, dataInit.listMethod, false, new List <int>(), 7000); //Create the client with her sended data /*Init client*/ InitClient.initClient(client, sendPort, File.ReadAllText(calculatorClass)); if (!listClient.ContainsKey(clientIP)) //Client exist? { listClient.Add(client.ip, client); if (OnUpdateClient != null) { OnUpdateClient(client); //Display client } } else //Client already exist and not detected deconnexion { List <int> tmpCurrentWork = new List <int>(listClient[clientIP].currentWork); foreach (int value in tmpCurrentWork) { if (!dataWork.tasks.ContainsKey(value)) //Load packet non calculated { dataWork.tasks.Add(value, cuttedTask[value - 1]); listClient[clientIP].currentWork.Remove(value); } } } break; case Command.Result: if (issueNumber == packet.issueNumber) //Working? Old sended packet? { if (!listResults.Contains(packet.noPacket)) //Task already calculated? { listResults.Add(packet.noPacket); } if (listResults.Count == nbrPacket) { timer.Stop(); } listClient[clientIP].currentWork.Remove(packet.noPacket); listClient[clientIP].interval = 7000; int secondToCalculate = SecondSince1970.Get() - listPacketSended[packet.noPacket].secondSince1970; if (OnUpdateWorkInfo != null) { OnUpdateWorkInfo(string.Format("{0} send result no {1}", clientIP, packet.noPacket)); } OnUpdateResult((int)(((float)listResults.Count / cuttedTask.Length) * 100)); //Display numbre results //Next works if (listClient[clientIP].currentWork.Count == 0) //All the work has been done? { if (dataWork != null && dataWork.tasks.Count != 0) //No more work? { avgCalculationTime = avgTime.calculateNewTime(SecondSince1970.Get() - listPacketSended[packet.noPacket].secondSince1970); //Calculate average time from current time and sended packet timeRemaining = avgCalculationTime * (nbrPacket - listPacketSended.Count); //Calculate the time to remaining calculation dataWork.sendWork(ref listClient, ref listPacketSended, clientIP, sendPort, nbrPacketToSend, issueNumber); } } if (savePacketsToFile) //Save to file? or display fractale? { string path = string.Format("{0}\\tmp\\result", Environment.CurrentDirectory); //Path of file data for this noPacket SaveToFile.save(path, FILE_EXTENTION, packet.noPacket.ToString(), packet.data); } else { if (OnDisplayFractal != null) { OnDisplayFractal(fractale.createFractale(packet.noPacket, packet.data, nbrPacket)); } } } break; case Command.State: break; case Command.Initialized: listClient[clientIP].initialised = true; if (dataWork != null && dataWork.tasks.Count != 0) //No more work? { dataWork.sendWork(ref listClient, ref listPacketSended, clientIP, sendPort, nbrPacketToSend, issueNumber); } break; case Command.CorrectIP: if (clientIP != "127.0.0.1") //No local host { serverIPs += clientIP.ToString() + ";"; } break; //case Command.AliveClient: //if (listClient != null && listClient.ContainsKey(clientIP)) // listClient[clientIP].interval = packet.secondSince1970 * 7; //break; } } GC.Collect(); } }
/// <summary> /// Send a work to a client /// </summary> /// <param name="listClient">List of clients</param> /// <param name="listPacketSended">Packet already sended</param> /// <param name="ipAddress">Ip address of a client</param> /// <param name="port">Port of a client</param> /// <param name="nbrPackets">Number packet to send</param> /// <param name="issueNumber">Issu number</param> public void sendWork(ref SortedList <string, Client> listClient, ref SortedList <int, PacketInfo> listPacketSended, string ipAddress, int port, int nbrPackets, int issueNumber) { List <byte[]> listWorksToSend = new List <byte[]>(); /*Connect to client*/ Sender s = new Sender(ipAddress, Convert.ToInt32(port)); SortedList <int, byte[]> tempListTasks = new SortedList <int, byte[]>(tasks); for (int i = 0; i < nbrPackets; i++) { if (tempListTasks.Count > 0) //More tasks? { int firstKey = tempListTasks.Keys[0]; byte[] data = tempListTasks[firstKey]; tempListTasks.Remove(firstKey); //remove temporary data, if the sender doesn't work /*Add info of data*/ PacketInfo packetInfo = new PacketInfo(Command.Work, firstKey, "", data.Length, SecondSince1970.Get(), issueNumber); if (!listPacketSended.ContainsKey(firstKey)) { listPacketSended.Add(firstKey, packetInfo); } listWorksToSend.Add(packetInfo.ToByte()); /*Add data*/ listWorksToSend.Add(data); listClient[ipAddress].currentWork.Add(firstKey); //Add to current client work } else { break; } } /*Assembly the packets*/ byte[] dataToSend = PacketAssembler.Assemble(listWorksToSend); /*Send data to client*/ s.send(dataToSend); int nbrPaquetsToRemove = nbrPackets; if (nbrPackets > tasks.Count) //More packet to remove than number of task? { nbrPaquetsToRemove = tasks.Count; } for (int i = 0; i < nbrPaquetsToRemove; i++) //Remove real data { tasks.RemoveAt(0); } }