Witam.
Pisze klienta gg pod konsole. Troche juz napisalem, jednak mam pewien problem. Po zalogowaniu na serwer gg wysylam mu pokolei dane osob z listy kontaktow ktora jest w pliku (numer gg i typ uzytkownika - normalny, zbanowany...). Po wyslaniu jednej osoby serwer przysyla mi dane o niej czyli jej status, ip itd. Nastepnie sprawdzam czy w tablicy Users_ID[] nastepna osoba ma numer gg rozny od 0 - jezeli tak to znowu wysylam pakiecik z danymi tej osoby i czekam na informacje od serwera o niej. Wszystko niby jest dobrze odbierane ale algorytm raz dziala dobrze, raz wcale, a czasami poczesci dobrze. Probowalem juz roznych sposobow na odbieranie i wysylanie np. wysylalem na raz wszystkie osoby, a potem odbieralem na raz informacje o nich. Nie mam juz pojecia gdzie moze byc blad :-(
case GG_LOGIN_OK:
{
{
mutex::scoped_lock lock(global_mutex); //zablokowanie zasobow
Interface.WriteMsg("w0.dat", "\nstan: zalogowany!");
Interface.Window_Act[0].index_a += 1;
Interface.Window_Act[0].index_b += 1;
Interface.Window_Act[0].index_e += 1;
//zmienna pomocnicza do obliczenia roznicy miedzy koncem pliku a dolnym indeksiem
int v = Interface.Window_Act[0].index_e - Interface.Window_Act[0].index_b;
Interface.Window_Act[0].index_a += v;
Interface.Window_Act[0].index_b += v;
Interface.ShowMsg("w0.dat", Interface.Window_Act[0].index_a, Interface.Window_Act[0].index_b, cmd_cur_nr);
if(Client.CheckContactsFile())
{
Client.LoadContacts(); //funkcja odczytujaca numery gadu gadu z pliku
Client.HClear(); //wyczyszczenie glownego pakietu
Client.Header.type = GG_NOTIFY_LAST; //pakiet wysylania kontaktu na serwer
Client.Header.length = sizeof(Client.Notify);
Client.Notify.uin = Users_Id[User_Act_Nr];
Client.Notify.type = GG_USER_NORMAL;
send(Sock1, (char *)&Client.Header, sizeof(Client.Header), 0);
send(Sock1, (char *)&Client.Notify, sizeof(Client.Notify), 0);
User_Act_Nr++;
}
else
{
//wyslanie pustej listy kontaktow
Client.HClear(); //wyczyszczenie glownego pakietu
Client.Header.type = GG_LIST_EMPTY; //pakiet pustej listy kontaktow
Client.Header.length = 0; //dlugosc pakietu zerowa
//wyslanie glownego pakietu z pusta lista kontaktow
send(Sock1, (char *)&Client.Header, sizeof(Client.Header), 0);
}
}
}
break;
case GG_NOTIFY_REPLY60:
{
{
//MessageBox(NULL, "REPLY60", "hmm", MB_OK);
mutex::scoped_lock lock(global_mutex); //zablokowanie zasobow
recv(Sock1, (char *)&Client.Notify_Reply60, sizeof(Client.Notify_Reply60), 0);
int index;
for(index = 0; Users_Id[index] != ((Client.Notify_Reply60.uin << 8) >> 8); index++);
Users_Info[index].uin = Client.Notify_Reply60.uin;
Users_Info[index].remote_ip = Client.Notify_Reply60.remote_ip;
Users_Info[index].remote_port = Client.Notify_Reply60.remote_port;
Users_Info[index].status = Client.Notify_Reply60.status;
Users_Info[index].version = Client.Notify_Reply60.version;
Users_Info[index].image_size = Client.Notify_Reply60.image_size;
Users_Info[index].unknown1 = Client.Notify_Reply60.unknown1;
Users_Info[index].description_size = Client.Notify_Reply60.description_size;
strcpy(Users_Info[index].description, Client.Notify_Reply60.description);
Users_Info[index].time = Client.Notify_Reply60.time;
if(Users_Id[User_Act_Nr] != 0)
{
Client.HClear(); //wyczyszczenie glownego pakietu
Client.Header.type = GG_NOTIFY_LAST;
Client.Header.length = sizeof(Client.Notify);
Client.Notify.uin = Users_Id[User_Act_Nr];
Client.Notify.type = GG_USER_NORMAL;
send(Sock1, (char *)&Client.Header, sizeof(Client.Header), 0);
send(Sock1, (char *)&Client.Notify, sizeof(Client.Notify), 0);
User_Act_Nr++;
}
else
{
Interface.ShowUsersAvailAndBusy(cmd_cur_nr);
}
}
}
break;
Interface.ShowUsersAvailAndBusy() - ta procedura nie jest na razie istotna, ma ona za zadanie tylko wypisac na ekran info o dostepnych osobach, dziala ona na 100% poprawnie
Juz wiem w czym tkwi problem. Wszystko przez serwer gadu-gadu. Chodzi o to ze po wyslaniu danych osoby (numerek i typ uzytkownika) serwer odpowiada pakietem z informacjami o niej (status itp) TYLKO I WYLACZNIE w przypadku gdy dana osoba jest dostepna (jezeli osoba jest niewidoczna lub niedostepna to serwer nie wysyla zadnego pakietu, ktory informowalby klienta o tym). Jezeli po wyslaniu pakietu okaze sie ze osoba ta nie jest dostepna to moj algorytm zawiesza sie tzn czeka ciagle na pakiet od serwera, a w rzeczywistosci go nigdy nie dostanie.
Niestety nie mam pomyslu jak obejsc to... tzn nie wiem czy moze jakis watek nowy utworzyc czy jakos inaczej kombinowac.
Macie jakies pomysly ?