Witam serdecznie,

Mam problem z programem wykorzystującym libgadu. Chcę wyciągnąć listę numerów GG np. z określonego miasta. Niech będzie nim Lublin. Program owszem wypisuje adresy ale z czasem tak jakby coraz wolniej i się zatrzymuje w martwym punkcie (trzeba jego przerwać).

Gdy bardziej sprecyzuję obszar poszukiwań czasem nie zawiesza się, ale czasem zawiesza się tak jakby na samym starcie (nie zawsze).

Poniżej przesyłam kod działający na Linuxie:

/* Program łączy się z katalogiem Publicznym i pobiera dane. Autor: Komeniusz [Nie odpowiadam za użycie tego programu!] Licencja: GNU - edukacyjna! Program testowano na: System: Ubuntu 9.10 Biblioteka: Libgadu 1.9.0-rc2 (wersja testowa) Download Libgadu: http://toxygen.net/libgadu/ Dokumentacja Libgadu: http://toxygen.net/libgadu/doc/ */
 
//Niezbędne biblioteki
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "libgadu.h"
#include <unistd.h>

int main(int argc, char **argv) {
if(argc < 5) {
	printf("Użycie: %s <numer> <hasło> <limit> <tryb>n", argv[0]);
    return 1;
}
 
//Nasze strukturki
struct gg_session *sesja;
struct gg_event *event;
struct gg_login_params p;
 
//Licznik znalezionych osób
int osoby;
 
//Limit odbieranych danych
int limit = atoi(argv[3]);
 
//Rodzaj wyprowadzanych danych
int tryb = atoi(argv[4]);
 
gg_debug_level = 0;
 
memset(&p, 0, sizeof(p));
p.uin = atoi(argv[1]);
p.password = argv[2];
p.encoding = GG_ENCODING_UTF8;
 
if(!(sesja = gg_login(&p))) {
	printf("Nie udało się połączyć: %sn", strerror(errno));
	gg_free_session(sesja);
	return 1;
}
 
//Tworzymy nowe zapytanie do serwera
gg_pubdir50_t zapytanie;
zapytanie = gg_pubdir50_new(GG_PUBDIR50_SEARCH_REQUEST);
 
if(!zapytanie) {
	printf("Brak pamięci");
}
 
//Wypełniamy pola zapytania do wyszukiwania w katalogu
//Struktura ogólna - gg_pubdir50_add(zapytanie, pole, "wartość");
 
//Zaczynamy od numeru - 0
gg_pubdir50_add(zapytanie, GG_PUBDIR50_START, "0");
 
//gg_pubdir50_add(zapytanie, GG_PUBDIR50_FIRSTNAME, "Magda");
gg_pubdir50_add(zapytanie, GG_PUBDIR50_CITY, "Lublin");
//gg_pubdir50_add(zapytanie, GG_PUBDIR50_BIRTHYEAR, "1999");
//Żądana płeć - kobieta
//gg_pubdir50_add(zapytanie, GG_PUBDIR50_GENDER, GG_PUBDIR50_GENDER_FEMALE);
 
//Osoby aktualnie dostępne
//gg_pubdir50_add(zapytanie, GG_PUBDIR50_ACTIVE, GG_PUBDIR50_ACTIVE_TRUE);
 
//Wszystkie rodzaje pól zapytań
/* GG_PUBDIR50_UIN Numer Gadu-Gadu. GG_PUBDIR50_STATUS Status (tylko wynik wyszukiwania). GG_PUBDIR50_FIRSTNAME Imię. GG_PUBDIR50_LASTNAME Nazwisko. GG_PUBDIR50_NICKNAME Pseudonim. GG_PUBDIR50_BIRTHYEAR Rok urodzenia lub przedział lat oddzielony spacją. GG_PUBDIR50_CITY Miejscowość. GG_PUBDIR50_GENDER Płeć. GG_PUBDIR50_GENDER_FEMALE Kobieta. GG_PUBDIR50_GENDER_MALE Mężczyzna. GG_PUBDIR50_ACTIVE Osoba dostępna (tylko wyszukiwanie). GG_PUBDIR50_ACTIVE_TRUE Wyszukaj tylko osoby dostępne. GG_PUBDIR50_START Numer początkowy wyszukiwania (tylko wyszukiwanie). GG_PUBDIR50_FAMILYNAME Nazwisko rodowe (tylko wysyłanie informacji o sobie). GG_PUBDIR50_FAMILYCITY Miejscowość pochodzenia (tylko wysyłanie informacji o sobie). */
 
//Wykonujemy zapytanie
gg_pubdir50(sesja, zapytanie);
 
//Aby móc komunikować się z serwerem
//Wysyłamy pustą listę kontaktów
if(gg_notify(sesja, NULL, 0) == -1) {
	printf("Polaczenie przerwane: %sn", strerror(errno));
	gg_free_session(sesja);
	return 1;
}
 
while(1) {
	if(!(event = gg_watch_fd(sesja))) {
		  printf("Polaczenie przerwane: %sn", strerror(errno));
		  gg_logoff(sesja);
		  gg_free_session(sesja);
		  return 1;
	}
 
//Jeśli odebraliśmy odpowiedź od
//Katalogu publicznego
/* GG_PUBDIR50_WRITE Wysłanie do serwera informacji o sobie. GG_PUBDIR50_READ Pobranie z serwera informacji o sobie. GG_PUBDIR50_SEARCH Wyszukiwanie w katalogu publicznym. GG_PUBDIR50_SEARCH_REPLY Wynik wyszukiwania w katalogu publicznym. */
	if(event->type == GG_EVENT_PUBDIR50_SEARCH_REPLY)  {
		gg_pubdir50_t wynik;
		int i, ilosc;
 
		wynik = event->event.pubdir50;
		ilosc = gg_pubdir50_count(wynik);
		char tab[32];
 
		if(ilosc < 1) {
			printf("Nie znaleziono");
			return;
		}
 
//Łączna ilość znalezionych osób
		osoby += ilosc;
 
//Wyciąganie informacji
		for(i = 0; i < ilosc; i++) {
			const char *numer, *imie, *pseudo, *urodzony, *miasto, *status;
			//printf("[%d]",i);
 
			numer = gg_pubdir50_get(wynik, i, GG_PUBDIR50_UIN);
			imie = gg_pubdir50_get(wynik, i, GG_PUBDIR50_FIRSTNAME);
			pseudo = gg_pubdir50_get(wynik, i, GG_PUBDIR50_NICKNAME);
			urodzony = gg_pubdir50_get(wynik, i, GG_PUBDIR50_BIRTHYEAR);
			miasto = gg_pubdir50_get(wynik, i, GG_PUBDIR50_CITY);
			status = gg_pubdir50_get(wynik, i, GG_PUBDIR50_STATUS);
 
//Jeśli drukujemy wszystkie informacje
			if(tryb != 1) {
//Drukowanie informacji
				printf("Numer: %snImię: %snPseudonim: %sn"
					   "Urodzony: %snMiejscowość: %sn",
					   numer, imie, pseudo, urodzony, miasto);
 
//Wyświetlamy status znalezionej osoby
				switch((status) ? atoi(status) : -1) {
					case GG_STATUS_AVAIL:
						printf("Dostępnyn");
						break;
					case GG_STATUS_BUSY:
						printf("Zajętyn");
						break;
					default:
						printf("(?)n");
				}
//Jeśli drukujemy wyłącznie numery
			} else {
				printf("%s\n",numer);

			}
		}
//Jeśli otrzymamy mniej, niż 20 wyników
//Oznacza to, że nie ma więcej danych do pobrania
		if(ilosc < 20) {
			break;
		}
 
//Jeśli ilość odebranych wyników będzie
//Większa od ustalonego limitu
		if(osoby > limit) {
			break;
		}
 
		snprintf(tab, sizeof(tab), "%d", gg_pubdir50_next(wynik));
		gg_pubdir50_add(zapytanie, GG_PUBDIR50_START, tab);
		gg_pubdir50(sesja, zapytanie);
	}
//Zwolnienie pamięci dla struktury zdarzenia
	gg_event_free(event);
}
 
//Zwolnienie pamięci dla struktury sesji
gg_free_session(sesja);
//Zwolnienie pamięci dla zapytania i odpowiedzi serwera
gg_pubdir50_free(zapytanie);
 
return 0;
}

Odpala się jego poleceniem ./gg [NUMER GG] [HASŁO DO NUMERU] LIMIT TRYB

czyli np.:

./gg 123456789 mojehaslo 20000 1

Z góry dzięki za pomoc.