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.
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.
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
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.
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.
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().
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:
Implementacja:
📂 Lokalizacja pliku: 'game -> questpc.cpp'
🔍 Szukaj
1. Skonsolidowanie instrukcji assert():
🔍 Szukaj
♻️ Zamień
2. Lista inicjalizująca
🔍 Szukaj
♻️ Zamień
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
♻️ Zamień
4. Aktualizacja warunków:
🔍 Szukaj
Wcześniej, żeby wysłać flagę "QUEST_SEND_ISBEGIN", najpierw zapisywano ją do bufora, a potem zwiększano rozmiar pakietu o 1.
♻️ Zamień
Nowa wersja działa tak samo, ale rozmiar pakietu zwiększa się o faktyczny rozmiar flagi, który jest zwracany przez funkcję sizeof()
🔍 Szukaj
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ń
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
♻️ Zamień
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
♻️ Zamień
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().