Skocz do zawartości

Naprawa błędu obliczania rozmiaru pakietu 'HEADER_GC_QUEST_INFO'

Opublikowano

image.png.a144663d4007d16872d3413c4a1a8bf3.png

 

Cześć,

 

W tym temacie przedstawię proste i klarowne rozwiązanie błędu związanego z niepoprawnym rozmiarem pakietu 'HEADER_GC_QUEST_INFO'. Ten problem sprawiał, że klient otrzymywał pakiet o niewłaściwej wielkości, co mogło skutkować awarią klienta lub błędnym wyświetlaniem danych.

 

Rozwiązanie:

Poprawiłem funkcję 'SendQuestInfoPakcet', dzięki czemu rozmiar pakietu 'qi.size' automatycznie aktualizuje się podczas zapisywania danych do bufora. To gwarantuje, że rozmiar pakietu jest zawsze odpowiedni.

 

Wprowadzone ulepszenia:

  • Połączyłem dwie instrukcje assert() w jedną, dla lepszej czytelności.
  • Użyłem listy inicjalizacyjnej do tworzenia struktury qi.
  • Stworzyłem bezpieczną funkcję lambda WriteToBuffer do zapisu danych w buforze.
  • Dodałem logi z precyzyjnymi informacjami o zapisanych danych.

 

Implementacja:

📂 Lokalizacja pliku: 'game -> questpc.cpp'

 

🔍 Szukaj

🔐 Ukryta Treść 🔐

 

1. Skonsolidowanie instrukcji assert():

🔍 Szukaj

🔐 Ukryta Treść 🔐

 

♻️ Zamień

🔐 Ukryta Treść 🔐

 

 

2. Lista inicjalizująca

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

♻️ Zamień

🔐 Ukryta Treść 🔐

 

 

3. Funkcja WriteToBuffer():

Wcześniej zapisywaliśmy strukturę do bufora na początku funkcji. To było błędne, bo powodowało nieprawidłowe obliczenie rozmiaru pakietu. Aby to naprawić, wprowadzimy nową funkcję lambda WriteToBuffer, która aktualizuje rozmiar pakietu dynamicznie po każdym zapisie do bufora. Dzięki temu rozmiar pakietu będzie zawsze zgodny z aktualnymi danymi. Funkcja WriteToBuffer również poprawia obsługę zapisu danych i zapewnia, że nie przekroczymy zarezerwowanego rozmiaru bufora. Jest to ważne, bo zapewnia integralność pakietów. Dodatkowo poprawiliśmy logi, żeby wyświetlały dokładną ilość zapisanych danych. Dzięki temu będzie łatwiej sprawdzić, co zostało zapisane w pakiecie.

 

🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 ♻️ Zamień

🔐 Ukryta Treść 🔐

 

 

4. Aktualizacja warunków:

🔍 Szukaj

🔐 Ukryta Treść 🔐

 

Wcześniej, żeby wysłać flagę "QUEST_SEND_ISBEGIN", najpierw zapisywano ją do bufora, a potem zwiększano rozmiar pakietu o 1.

 

   ♻️ Zamień

🔐 Ukryta Treść 🔐

 

Nowa wersja działa tak samo, ale rozmiar pakietu zwiększa się o faktyczny rozmiar flagi, który jest zwracany przez funkcję sizeof()

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

Wcześniej, żeby wysłać tytuł zadania, najpierw zarezerwowano miejsce na 31 znaków w buforze. To nie było bezpieczne, bo mogło dojść do przekroczenia buforu

 

 ♻️ Zamień

🔐 Ukryta Treść 🔐

 

Teraz, żeby wysłać tytuł zadania, najpierw obliczamy jego rzeczywisty rozmiar, używając funkcji sizeof(). Następnie używamy funkcji WriteToBuffer() do bezpiecznego zapisania tytułu do bufora. Funkcja WriteToBuffer() ogranicza rozmiar tytułu do 31 znaków, co zapobiega przekroczeniu buforu.

 

5. Zastosujmy pozostałe warunki

🔍 Szukaj

🔐 Ukryta Treść 🔐

 

♻️ Zamień

🔐 Ukryta Treść 🔐

 

 

6. Wysyłanie pakietu

Wcześniej pakiet był wysyłany za jednym razem, łącznie ze strukturą 'qi' i danymi z bufora. Funkcja Packet() wysyła wszystkie dane z bufora do klienta.

 

🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 ♻️ Zamień

🔐 Ukryta Treść 🔐

 

W nowej wersji najpierw wysyłana jest struktura 'qi', a następnie dane z bufora. Funkcja BufferedPacket() wysyła dane do bufora, który jest następnie wysyłany do klienta funkcją Packet().

Featured Replies

Opublikowano

Poezja madafaka!

 

Opublikowano

Bardzo Ci dziękuję za pomoc!

 

  • Sevence zmienił(a) tytuł na Naprawa błędu obliczania rozmiaru pakietu 'HEADER_GC_QUEST_INFO'
Opublikowano

Dziękuje

  • 2 miesiące temu...
Opublikowano

Jakub wruc

  • 4 tygodnie później...
Opublikowano
  • Premium

thx

  • 1 miesiąc temu...
Opublikowano

ciekawi mnie gdzie byl blad dlatego pisze komentarz, zeby to sprawdzic

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...