Opublikowano 9 Grudnia 20232 l 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 Tylko zalogowani Zaloguj się, aby wyświetlić chronioną treść Ten post zawiera treści dostępne tylko dla członków. Zaloguj się lub utwórz konto, aby odblokować całą zawartość tego posta. Zaloguj się Utwórz konto 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().
Opublikowano 20 Kwietnia 20242 l ciekawi mnie gdzie byl blad dlatego pisze komentarz, zeby to sprawdzic
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto