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 ?