Opublikowano 9 Grudnia 20231 r 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ść 🔐 Zaloguj się lub Zarejestruj się 1. Skonsolidowanie instrukcji assert(): 🔍 Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ♻️ Zamień 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 2. Lista inicjalizująca 🔍 Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ♻️ Zamień 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 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ść 🔐 Zaloguj się lub Zarejestruj się ♻️ Zamień 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 4. Aktualizacja warunków: 🔍 Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 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ść 🔐 Zaloguj się lub Zarejestruj się 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ść 🔐 Zaloguj się lub Zarejestruj się 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ść 🔐 Zaloguj się lub Zarejestruj się 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ść 🔐 Zaloguj się lub Zarejestruj się ♻️ Zamień 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 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ść 🔐 Zaloguj się lub Zarejestruj się ♻️ Zamień 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 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 20241 r 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ą.