RDP-Packing fix

This commit is contained in:
AnloGames 2024-08-20 03:17:52 +03:00
parent 5f902bed7a
commit 93125d97cd
3 changed files with 35 additions and 30 deletions

View file

@ -19,7 +19,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
{ {
public class ClientNetworkManager public class ClientNetworkManager
{ {
private int port = 0; private int PlayerId;
private IPEndPoint endPoint; private IPEndPoint endPoint;
private IPEndPoint sendingEP; private IPEndPoint sendingEP;
private Socket socket; private Socket socket;
@ -71,29 +71,32 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
JToken token = JToken.FromObject(jObj); JToken token = JToken.FromObject(jObj);
JToken updateDatas = token["updateDatas"]; JToken updateDatas = token["updateDatas"];
Datagramm Dgramm = new Datagramm(); Datagramm Dgramm = new Datagramm();
if (PlayerId == 0)
{
PlayerId = token["PlayerId"].ToObject<int>();
}
Dgramm.isImportant = token["isImportant"].ToObject<bool>(); Dgramm.isImportant = token["isImportant"].ToObject<bool>();
Dgramm.DatagrammId = token["DatagrammId"].ToObject<int>(); Dgramm.DatagrammId = token["DatagrammId"].ToObject<int>();
Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]);
if (Dgramm.isImportant) if (Dgramm.isImportant)
{ {
if (Dgramm.DatagrammId == currentServerDatagrammId + 1) if (Dgramm.DatagrammId == currentServerDatagrammId + 1)
{ {
ExecuteDatagramm(Dgramm);
currentServerDatagrammId++; currentServerDatagrammId++;
Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]);
ExecuteDatagramm(Dgramm);
CheckDatagramm(); CheckDatagramm();
} }
else if (Dgramm.DatagrammId > currentServerDatagrammId + 1) else if (Dgramm.DatagrammId > currentServerDatagrammId + 1 &&
waitingDatagramm.Find(x => x.DatagrammId == Dgramm.DatagrammId) == null)
{ {
Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]);
waitingDatagramm.Add(Dgramm); waitingDatagramm.Add(Dgramm);
} }
else
{
Console.WriteLine("Апдейты " + Dgramm.DatagrammId + ", уже приходили, пропускаем");
}
SendAcknowledgement(Dgramm.DatagrammId); SendAcknowledgement(Dgramm.DatagrammId);
} }
else else
{ {
Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]);
ExecuteDatagramm(Dgramm); ExecuteDatagramm(Dgramm);
} }
@ -162,7 +165,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
public void SendAcknowledgement(int DatagrammId) public void SendAcknowledgement(int DatagrammId)
{ {
Datagramm Dgramm = new Datagramm() { DatagrammId = DatagrammId }; Datagramm Dgramm = new Datagramm() { DatagrammId = DatagrammId, PlayerId = PlayerId };
string data = System.Text.Json.JsonSerializer.Serialize(Dgramm); string data = System.Text.Json.JsonSerializer.Serialize(Dgramm);
byte[] buffer = Encoding.UTF8.GetBytes(data); byte[] buffer = Encoding.UTF8.GetBytes(data);
socket.SendTo(buffer, sendingEP); socket.SendTo(buffer, sendingEP);
@ -173,8 +176,9 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
Datagramm orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1); Datagramm orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1);
while (orderedDgramm != null) while (orderedDgramm != null)
{ {
ExecuteDatagramm(orderedDgramm);
currentServerDatagrammId++; currentServerDatagrammId++;
ExecuteDatagramm(orderedDgramm);
waitingDatagramm.Remove(orderedDgramm);
orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1); orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1);
} }
} }

View file

@ -20,7 +20,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
public class ServerNetworkManager public class ServerNetworkManager
{ {
private Socket socket; private Socket socket;
private IPAddress ip = IPAddress.Parse("127.0.0.1"); private IPAddress ip;
private bool isMultiplayer; private bool isMultiplayer;
//Player Id to Player endPoint //Player Id to Player endPoint
private List<IPEndPoint> clientsEP; private List<IPEndPoint> clientsEP;
@ -28,9 +28,8 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
private List<UpdateData> commonUpdates; private List<UpdateData> commonUpdates;
private List<UpdateData> importantUpdates; private List<UpdateData> importantUpdates;
private List<Datagramm> sendedData; private List<Datagramm> sendedData;
private List<int> arrivingDataId = new List<int>(); private List<Datagramm> arrivingDataId;
private int currentDatagrammId = 1; private int currentDatagrammId = 1;
private int nextPlayerId = 0;
public delegate void OnDataSend(string data); public delegate void OnDataSend(string data);
public event OnDataSend GetDataSend; // event public event OnDataSend GetDataSend; // event
Thread serverThread; Thread serverThread;
@ -48,6 +47,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
commonUpdates = new List<UpdateData>(); commonUpdates = new List<UpdateData>();
importantUpdates = new List<UpdateData>(); importantUpdates = new List<UpdateData>();
sendedData = new List<Datagramm>(); sendedData = new List<Datagramm>();
arrivingDataId = new List<Datagramm>();
GetDataSend += AnalyzeData; GetDataSend += AnalyzeData;
@ -101,37 +101,37 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
#endregion #endregion
if (arrivingDataId.Count != 0) if (arrivingDataId.Count != 0)
{ {
List<int> actualArrivingId = arrivingDataId; List<Datagramm> actualArrivingId = arrivingDataId;
for (int i = 0; i < actualArrivingId.Count; i++) for (int i = 0; i < actualArrivingId.Count; i++)
{ {
sendedData.Remove(sendedData.Find(x => x.DatagrammId == actualArrivingId[i])); sendedData.Remove(sendedData.Find(x => x.DatagrammId == actualArrivingId[i].DatagrammId
&& x.PlayerId == actualArrivingId[i].PlayerId));
} }
arrivingDataId.Clear(); arrivingDataId.Clear();
} }
List<UpdateData> dataToSend; List<UpdateData> dataToSend;
if (importantUpdates.Count != 0) if (importantUpdates.Count != 0 || sendedData.Count != 0)
{ {
Datagramm impDgramm = new Datagramm();
impDgramm.DatagrammId = currentDatagrammId;
currentDatagrammId++;
dataToSend = new List<UpdateData>(); dataToSend = new List<UpdateData>();
for (int i = 0; i < 200 && i < importantUpdates.Count; i++) for (int i = 0; i < 200 && i < importantUpdates.Count; i++)
dataToSend.Add(importantUpdates[i]); dataToSend.Add(importantUpdates[i]);
impDgramm.updateDatas = dataToSend; for (int i = 0; i < clientsEP.Count; i++)
impDgramm.isImportant = true;
sendedData.Add(impDgramm);
foreach (Datagramm Dgramm in sendedData)
{ {
Datagramm impDgramm = new Datagramm();
string impData = JsonSerializer.Serialize(Dgramm); impDgramm.DatagrammId = currentDatagrammId;
byte[] impBuffer = Encoding.UTF8.GetBytes(impData); impDgramm.updateDatas = dataToSend;
foreach (EndPoint sendingEP in clientsEP) impDgramm.isImportant = true;
impDgramm.PlayerId = i + 1;
sendedData.Add(impDgramm);
foreach (Datagramm Dgramm in sendedData.Where(x => x.PlayerId == i+1))
{ {
socket.SendTo(impBuffer, sendingEP); string impData = JsonSerializer.Serialize(Dgramm);
byte[] impBuffer = Encoding.UTF8.GetBytes(impData);
socket.SendTo(impBuffer, clientsEP[i]);
} }
} }
currentDatagrammId++;
for (int i = 0; i < 200 && i < dataToSend.Count; i++) for (int i = 0; i < 200 && i < dataToSend.Count; i++)
importantUpdates.RemoveAt(0); importantUpdates.RemoveAt(0);
} }
@ -213,7 +213,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
if (Dgramm.updateDatas == null) if (Dgramm.updateDatas == null)
{ {
//Обработка acknowledgement //Обработка acknowledgement
arrivingDataId.Add(Dgramm.DatagrammId); arrivingDataId.Add(Dgramm);
} }
else else
{ {

View file

@ -11,5 +11,6 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates
public int DatagrammId { get; set; } public int DatagrammId { get; set; }
public bool isImportant { get; set; } public bool isImportant { get; set; }
public List<UpdateData> updateDatas { get; set; } public List<UpdateData> updateDatas { get; set; }
public int PlayerId { get; set; }
} }
} }