Witam. Mam problem z pobraniem listy kontaktow z serwera gg. Wysylam do serwera odpowiednia strukture UserList_Request o typie 0x02. Serwer odpowiada mi nastepujaco: jezeli lista kontaktow jest mala to przysyla mi tylko jedna strukture typu UserList_Reply w ktorej zmienna typ ma wartosc 0x06, jednak jezeli lista kontaktow jest dluga to najpierw serwer przesyla kilka struktur UserList_Reply o zmiennej wartosci type 0x04 (struktury te maja rozne rozmiary, serwer nie dzieli rowno rozmarow pakietow listy kontaktow !!) a na koncu strukture UserList_Reply jednak o wartosci 0x06 ktora sygnalizuje ostatnia czesc pakietow listy kontaktow. Wszystko cacy tylko ze przy pobieraniu listy z serwera nie zawsze chce mi sie ona pobrac do mojego programu, a jezeli nawet uda sie ja pobrac to wtedy ostatni pakiet listy kontaktow zawiera uszkodzony pierwszy wpis osoby w zmiennej char request[]. Nie mam pojecia dlaczego tak sie dzieje... ????
Ponizej sa fragmenty kodu mojego programu:
#define GG_USERLIST_GET 0x02
#define GG_USERLIST_GET_MORE_REPLY 0x04
#define GG_USERLIST_GET_REPLY 0x06
#define GG_USERLIST_REQUEST 0x0016
#define GG_USERLIST_REPLY 0x0010
struct gg_userlist_reply {
char type; /* rodzaj zapytania */
char request[2049]; /* treść, nie musi wystąpić */
};
struct gg_userlist_request {
char type; /* rodzaj zapytania */
char request[]; /* treść, nie musi wystąpić */
};
struct gg_userlist_request UserList_Request;
struct gg_userlist_reply UserList_Reply;
while(1)
{
recv(Sock1, (char *)&Header, sizeof(Header), 0);
switch(Header.type)
{
case GG_LOGIN_OK:
//.........
//tutaj wysylam pakiet z prosba o przeslanie listy kontaktow
Header.type = GG_USERLIST_REQUEST;
Header.length = sizeof(UserList_Request);
UserList_Request.type = GG_USERLIST_GET;
send(Sock1, (char *)&Header, sizeof(Header), 0);
send(Sock1, (char *)&UserList_Request, sizeof(UserList_Request), 0);
//...........
break;
case GG_USERLIST_REPLY:
//tutaj odbierana jest lista kontaktow z serwera i wyswietlana w konsoli
int g = 0;
for(g; g < Header.length; g = g + strlen(UserList_Reply.request))
{
recv(Sock1, (char *)&UserList_Reply, sizeof(UserList_Reply), 0);
for(int b = 0; b < strlen(UserList_Reply.request); b++)
cout << UserList_Reply.request[b];
}
break;
}
}
Sa to glowne fragmenty mojego programu, jezeli ktos nie rozumie (nie jest w temacie) to niech sie nie pyta co i jak [!!!] Lepiej niech tutaj zerknie: <url>dev.null.pl/ekg/docs/protocol.html</url>
PS. Probowalem zmieniac rozmiar tablicy request np na [5000] albo w ogóle nie podawac go [] jednak zawsze mam ten sam blad z ostatnim pakietem listy kontaktow :|