private void frmBase_FormClosing(object sender, FormClosingEventArgs e) { try { if (serverSocket != null) //if (serverSocket.Connected) { Packet sendData = new Packet(); sendData.ChatMessage = "LogOut"; sendData.ChatDataIdentifier = DataIdentifier.Message; byte[] data = sendData.GetDataStream(); for (int i = 0; i < CLientsList.Count; i++) serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep); } } catch { } }
void NewSession() { Packet sendData = new Packet(); sendData.ChatMessage = "LogOut"; sendData.ChatDataIdentifier = DataIdentifier.Message; byte[] data = sendData.GetDataStream(); for (int i = 0; i < CLientsList.Count; i++) serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep); if (serverSocket != null) { //serverSocket.Disconnect(true); serverSocket.Dispose(); //serverSocket.Close(); } Hide(); frmAutorization frmA = new frmAutorization(); frmA.ShowDialog(); connection = frmA.connection; db = new DB_CEGSA(connection); var_G = new BigInteger(0); var_Q = new BigInteger(0); var_Y = new BigInteger(0); var_E = new BigInteger(0); var_S = new BigInteger(0); var_R = new BigInteger(0); var_NewE = new BigInteger(0); var_NewR = new BigInteger(0); var_Si = new BigInteger[1]; var_Hi = new BigInteger[1]; var_Ri = new BigInteger[1]; var_Yi = new BigInteger[1]; int var_Ri_Count = 0; int var_Yi_Count = 0; int var_Si_Count = 0; int var_Hi_Count = 0; this.AcceptButton = btnStart; kol_clients = 0; AllowAutorize = true; try { clientList.Clear(); } catch { } try { listClients.Clear(); } catch { } try { lstClients.Items.Clear(); } catch { } try { CLientsList.Clear(); } catch { } lstCurrentClients.Items.Clear(); progressBar1.Value = 0; toolStrip1.Enabled = true; tbtnAdd.Enabled = true; tbtnDel.Enabled = true; tbtnEdit.Enabled = true; tbtnChangeAdminPass.Enabled = true; btnStart.Enabled = true; lstClients.Enabled = true; lstCurrentClients.Enabled = true; lstCurrentClients.Visible = true; btnAddClient.Visible = true; btnAddAllClients.Visible = true; btnDelAllClients.Visible = true; btnDelClient.Visible = true; label1.Visible = true; lstCurrentClients.Enabled = true; btnAddClient.Enabled = true; btnAddAllClients.Enabled = true; btnDelAllClients.Enabled = true; btnDelClient.Enabled = true; label1.Enabled = true; cmbServerAddress.Enabled = true; ReadListClients(); Show(); }
private void ReceiveData(IAsyncResult asyncResult) { try { byte[] data; // Initialise a packet object to store the received data Packet receivedData = new Packet(this.dataStream); // Initialise a packet object to store the data to be sent Packet sendData = new Packet(); // Initialise the IPEndPoint for the clients IPEndPoint clients = new IPEndPoint(IPAddress.Any, 8080); // Initialise the EndPoint for the clients EndPoint epSender = (EndPoint)clients; IPEndPoint broadcast = new IPEndPoint(IPAddress.Broadcast, 0); EndPoint epBroadcast = (EndPoint)broadcast; // Receive all data serverSocket.EndReceiveFrom(asyncResult, ref epSender); // Start populating the packet to be sent sendData.ChatDataIdentifier = receivedData.ChatDataIdentifier; switch (receivedData.ChatDataIdentifier) { case DataIdentifier.Message: { if (receivedData.ChatMessage[0] == '~') { bool find = false; bool OutSession = true; if (AllowAutorize) { string[] temp = receivedData.ChatMessage.Split('|'); var query = from U in db.User where U.Login == temp[1] && U.Password == temp[2] select U; foreach (User U in query) { for (int i = 0; i < listClients.Count; i++) { if (U.Login == listClients[i].Login) { CLIENT NewClient = new CLIENT(); NewClient.ep = epSender; NewClient.user = U; bool exist = false; for (int j = 0; j < CLientsList.Count; j++) if (CLientsList[j].user.Login == U.Login) { exist = true; break; } if (!exist) { CLientsList.Add(NewClient); find = true; kol_clients++; OutSession = false; } } if (lstCurrentClients.Items[i].ToString() == U.Login) if (lstCurrentClients.InvokeRequired) lstCurrentClients.Invoke(new SetChecked(Checked), i); } } } sendData.ChatMessage = "!"; if (find) sendData.ChatMessage += "|True"; else sendData.ChatMessage += "|False"; //sendData.ChatMessage = "True"; if (OutSession) sendData.ChatMessage += "|Out"; data = sendData.GetDataStream(); serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, epSender, new AsyncCallback(this.SendData), epSender); // serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, epSender, new AsyncCallback(this.SendData), epSender); if (kol_clients == listClients.Count) { if (lstClients.InvokeRequired) { lstClients.Invoke(new Progress(RaiseProgress), null); lstClients.Invoke(new SetText(SetlblStatusText), "Идет генерация ключей"); } serverSocket.EnableBroadcast = true; sendData.ChatMessage = "AllClOK"; data = sendData.GetDataStream(); AllowAutorize = false; var_Ri = new BigInteger[kol_clients]; var_Si = new BigInteger[kol_clients]; var_Hi = new BigInteger[kol_clients]; var_Yi = new BigInteger[kol_clients]; var_Ri_Count = 0; var_Si_Count = 0; var_Hi_Count = 0; var_Yi_Count = 0; ////serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.Broadcast, epBroadcast, new AsyncCallback(this.SendData), broadcast); for (int i = 0; i < CLientsList.Count; i++) serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep); ///P var_P = Sign.BI_Generate_P(); if (lstClients.InvokeRequired) lstClients.Invoke(new Progress(RaiseProgress), null); sendData.ChatMessage = "P|" + var_P.ToString(); //if (textBox1.InvokeRequired) // textBox1.Invoke(new SetText(PrintText), sendData.ChatMessage); data = sendData.GetDataStream(); for (int i = 0; i < CLientsList.Count; i++) serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep); //MessageBox.Show(sendData.ChatMessage); /////Q var_Q = Sign.BI_Generate_Q(var_P); if (lstClients.InvokeRequired) lstClients.Invoke(new Progress(RaiseProgress), null); sendData.ChatMessage = "Q|" + var_Q.ToString(); data = sendData.GetDataStream(); for (int i = 0; i < CLientsList.Count; i++) serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep); //MessageBox.Show(sendData.ChatMessage); /////G var_G = Sign.BI_Generate_G(var_P, var_Q); if (lstClients.InvokeRequired) lstClients.Invoke(new Progress(RaiseProgress), null); sendData.ChatMessage = "G|" + var_Q.ToString(); data = sendData.GetDataStream(); for (int i = 0; i < CLientsList.Count; i++) serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep); //MessageBox.Show(sendData.ChatMessage); } } else if (receivedData.ChatMessage[0] == 'R') { if (var_Ri_Count < kol_clients) { string[] temp = receivedData.ChatMessage.Split('|'); var_Ri[var_Ri_Count] = new BigInteger(temp[1], 10); //MessageBox.Show("Ri[" + var_Ri_Count.ToString() + "]= "+ var_Ri[var_Ri_Count].ToString()); var_Ri_Count++; if (var_Ri_Count == kol_clients) { var_R = Sign.Calculate_R(var_Ri, var_P); if (lstClients.InvokeRequired) lstClients.Invoke(new Progress(RaiseProgress), null); //MessageBox.Show(var_R.ToString()); var_E = Sign.Calculate_E(var_R, var_Q); if (lstClients.InvokeRequired) lstClients.Invoke(new Progress(RaiseProgress), null); sendData.ChatMessage = "E|" + var_E.ToString(); data = sendData.GetDataStream(); for (int i = 0; i < CLientsList.Count; i++) serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep); if (lstClients.InvokeRequired) lstClients.Invoke(new SetText(SetlblStatusText), "Ожидание ответа от клиентов..."); } } } else if (receivedData.ChatMessage[0] == 'S') { if (var_Si_Count < kol_clients) { if (lstClients.InvokeRequired) lstClients.Invoke(new SetText(SetlblStatusText), "Идет генерация ЭЦП..."); string[] temp = receivedData.ChatMessage.Split('|'); var_Si[var_Si_Count] = new BigInteger(temp[1], 10); //MessageBox.Show("Si[" + var_Si_Count.ToString() + "]= " + var_Si[var_Si_Count].ToString()); var_Si_Count++; if (var_Si_Count == kol_clients) { var_S = Sign.Calculate_S(var_Si, var_Q); if (lstClients.InvokeRequired) lstClients.Invoke(new Progress(RaiseProgress), null); // MessageBox.Show(var_S.ToString()); sendData.ChatMessage = "S|" + var_S.ToString(); data = sendData.GetDataStream(); for (int i = 0; i < CLientsList.Count; i++) serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep); } } } else if (receivedData.ChatMessage[0] == 'Y') { if (var_Yi_Count < kol_clients) { string[] temp = receivedData.ChatMessage.Split('|'); var_Yi[var_Yi_Count] = new BigInteger(temp[1], 10); //MessageBox.Show("Yi[" + var_Yi_Count.ToString() + "]= " + var_Yi[var_Yi_Count].ToString()); var_Yi_Count++; if (var_Yi_Count == kol_clients) { sendData.ChatMessage = "Need_Hi"; data = sendData.GetDataStream(); for (int i = 0; i < CLientsList.Count; i++) serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep); } } } else if (receivedData.ChatMessage[0] == 'H') { if (var_Hi_Count < kol_clients) { string[] temp = receivedData.ChatMessage.Split('|'); var_Hi[var_Hi_Count] = new BigInteger(temp[1], 10); //MessageBox.Show("Hi[" + var_Hi_Count.ToString() + "]= " + var_Hi[var_Hi_Count].ToString()); var_Hi_Count++; if (var_Hi_Count == kol_clients) { var_Y = Sign.Calculate_Y(var_Yi, var_Hi, var_P); if (lstClients.InvokeRequired) lstClients.Invoke(new Progress(RaiseProgress), null); //MessageBox.Show("Y= " + var_Y.ToString()); Session session = new Session(); session.E = var_E.ToString(); session.G = var_G.ToString(); session.P = var_P.ToString(); session.S = var_S.ToString(); session.Y = var_Y.ToString(); session.Q = var_Q.ToString(); try { db.Session.InsertOnSubmit(session); db.SubmitChanges(); } catch (Exception ex) { MessageBox.Show("Не удалось добавить данные в базу по причине:\n" + ex.ToString()); } sendData.ChatMessage = "OK"; if (lstClients.InvokeRequired) { lstClients.Invoke(new Progress(MaxProgress), null); lstClients.Invoke(new SetText(SetlblStatusText), "Документ подписан"); } bool VerifyResult = Sign.Verify_Sign(var_Y, var_E, var_S, var_P, var_Q, var_G); data = sendData.GetDataStream(); for (int i = 0; i < CLientsList.Count; i++) serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep); DateTime CurrDate = DateTime.Now; SignFileName = "Sign_" + CurrDate.Day.ToString() + "." + CurrDate.Month.ToString() + "." + CurrDate.Year.ToString() + "_" + CurrDate.Hour.ToString() + "." + CurrDate.Minute.ToString() + "." + CurrDate.Second.ToString() + ".CEGSA"; FileStream FS = new FileStream(SignFileName, FileMode.Create); StreamWriter sw = new StreamWriter(FS); sw.WriteLine(var_S.ToString()); sw.WriteLine(var_E.ToString()); sw.Close(); /* if (VerifyResult) MessageBox.Show("Подпись верна", "Сервер"); else MessageBox.Show("Подпись НЕ верна", "Сервер"); * */ frmFinalMsg frmFinMsg = new frmFinalMsg(); frmFinMsg.ChangePrompt("Композиционная ЭЦП успешно сформирована и сохранена\nв " + SignFileName); frmFinMsg.ShowDialog(); if (frmFinMsg.flagNewSession) if (lstClients.InvokeRequired) { lstClients.Invoke(new BeginNewSes(BeginNewSession), null); while (true) ; } } } } else if (receivedData.ChatMessage[0] == 'V') { string[] temp = receivedData.ChatMessage.Split('|'); var_S = new BigInteger(temp[1], 10); } else if (receivedData.ChatMessage[0] == 'B') { string[] temp = receivedData.ChatMessage.Split('|'); var_E = new BigInteger(temp[1], 10); bool VerifyResult = false; if (var_S != 0) { if (lstClients.InvokeRequired) lstClients.Invoke(new Progress(MaxProgress), null); var sessions = from S in db.Session where S.S == var_S.ToString() && S.E == var_E.ToString() select S; foreach (Session session in sessions) { var_Y = new BigInteger(session.Y, 10); var_G = new BigInteger(session.G, 10); var_P = new BigInteger(session.P, 10); var_Q = new BigInteger(session.Q, 10); VerifyResult = Sign.Verify_Sign(var_Y, var_E, var_S, var_P, var_Q, var_G); } } if (VerifyResult) sendData.ChatMessage = "VerifyTrue"; else sendData.ChatMessage = "VerifyFalse"; data = sendData.GetDataStream(); serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, epSender, new AsyncCallback(this.SendData), epSender); } //else //if (receivedData.ChatMessage == "LogOut") //{ // if (!AllowAutorize) // { // sendData.ChatMessage = "LogOut"; // sendData.ChatDataIdentifier = DataIdentifier.Message; // data = sendData.GetDataStream(); // for (int i = 0; i < CLientsList.Count; i++) // serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep); // MessageBox.Show("Сессия завершена одним из клиентов"); // if (lstClients.InvokeRequired) // lstClients.Invoke(new Progress(NewSession), null); // listClients.Clear(); // CLientsList.Clear(); // } //} } break; case DataIdentifier.LogIn: // Разрешаем авторизацию пользователей sendData.ChatMessage = "#"; data = sendData.GetDataStream(); serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, epSender, new AsyncCallback(this.SendData), epSender); break; } // Get packet as byte array data = sendData.GetDataStream(); // Listen for more connections again... serverSocket.BeginReceiveFrom(this.dataStream, 0, this.dataStream.Length, SocketFlags.None, ref epSender, new AsyncCallback(this.ReceiveData), epSender); } catch (ObjectDisposedException) { } catch (ArgumentException) { } catch (Exception ex) { if (ex.Message != "Удаленный хост принудительно разорвал существующее подключение") ; MessageBox.Show("ReceiveData Error: " + ex.Message, "Server", MessageBoxButtons.OK, MessageBoxIcon.Error); } }