pobieranie list w GG

0
   req.type=0x02;
   glowa.type = GG_USERLIST_REQUEST;
   glowa.length = sizeof(req);
   send(gniazdo, (char*)&glowa, sizeof(glowa),0);
   send(gniazdo, (char*)&req, sizeof(req),0);  
                    
   recv(gniazdo, (char*)&glowa, sizeof(glowa), 0);

   if(glowa.type == GG_USERLIST_REPLY)
    {  

        while(loop<glowa.length)
       {
            recv(gniazdo, (char*)&rep, glowa.length, 0); 
            zapisz(rep.request);
            loop=loop+strlen(rep.request);
        }
    }  

sposób który opisałem na górze nie działa bo serwer zwraca glowa.length=4077 podczas gdy długość listy to ponad 7000. A więc pętla kończy sie zbyt wcześnie

rep.type jest zwraca poprawną wartość tylko za pierwszym razem (GG_USERLIST_GET_MORE_REPLY) potem to już są dziwne wartości typu 52,56,104.
A więc pętli nie moge zakończyć gdy dostane GG_USERLIST_GET_REPLY.

Co ciekawe mimo tego że przekroczyłem 4077 znaków serwer dalej wysyła liste. więc teoretycznie mogę ją pograć całą ale jedynie wtedy gdy ustawie pętle na określoną ilość iteracji (a przecież nie o to chodzi)

Moje pytanie jest takie:
Dlaczego rep.type zwraca mi złe wartości? czy powinienem po każdym odebraniu wysylać jakiś pakiet do serwera?

z góry dzięki za pomoc

0

sęk może tkwić z tym, że pakiety z których składa się lista są różnej długości i różnych typów. musisz kombinować. Najlepiej spreparowac sobie zapytanie o 3-4 kontakty i na tym testowac. Sam napisałem klienta gg w C# i pamietam, ze całkiem dużo czasu mi zajęło rozkminienie tego tak, żeby działało bez zarzutu.

0

no niestety. pakiety nie sa jednakowej dlugosci. wiekszosc ma kolo 500 znakow. ale bywaja takie po 300 czy nawet 180.
zresza co z tego ze znam dlugosc pakietu jak nie wiem ile ich mi przyjdzie. gdyby serwer zwracal faktyczna dlugosc to pikus, ale tak sie nie dzieje

skoczyc przy nadejsciu GG_USERLIST_GET_REPLY tez nie moge bo serwer wysyla jakies smieci.

normalnie masakra [glowa]

1 użytkowników online, w tym zalogowanych: 0, gości: 1