Cześć, chciałbym się zapytać o dwie kwestie:

1. Jak serwer rozpoznaje, której wersji protokołu użyć? Czy na postawie ciągu 
znaków "version"? Czy już zam fakt użycia GG_LOGIN80 określa wersję protokołu?

2. Rozłączanie. Nie potrafię określić warunków, kiedy serwer wyśle pakiet 
GG_DISCONNECT_ACK.

W tej chwili moja biblioteka ma następujące handlery wiadomości - załącznik 
"handlers.txt". Dla ustalenia uwagi - "CloseConnectionWorker" ustawia event 
mówiący, że wszystkie ewentualne wątki mają zakończyć działanie oraz zamyka 
socketa.

Teraz problem - gdy rozłączam ("DisconnectWorker" z załącznika 
"disconnect.txt") to są dwie drogi - jeśli stan jest zalogowany - ustawiam 
status, jeśli nie - wołam bezpośrednio "CloseConnectionWorker". W przypadku 
zmiany statusu serwer powinien wysłać mi jeszcze GG_DISCONNECT_ACK - wtedy 
(zerknijcie na "hadlers.txt") zawołam końcowy "CloseConnectionWorker". Niestety 
- od razu po "ChangeStatus" serwer zamyka socketa.

Na co powienienen dodatkowo zwrócić uwagę? Flagi przy logowaniu, wersja 
klienta, inne?

Dzięki i pozdrawiam,
Marcin
                                        case GG_PACKET_R_DISCONNECTING:
                                                
::OutputDebugString(_T("GG_PACKET_R_DISCONNECTING\n"));
                                                {
                                                        
CloseConnectionWorker(m_AutoReconnect,FALSE);
                                                }
                                                break;
                                        case GG_PACKET_R_DISCONNECT_ACK:
                                                
::OutputDebugString(_T("GG_PACKET_R_DISCONNECT_ACK\n"));
                                                {
                                                        
CloseConnectionWorker(FALSE,FALSE);
                                                }
                                                break;
        BOOL ggLibrary::DisconnectWorker(BOOL bLeaveDescription,BOOL 
bNotifyReconnect)
        {
                if(DisconnectValidate(bLeaveDescription,bNotifyReconnect))
                {
                        switch(GetState())
                        {
                        case GG_STATE_LOGGED_IN:
                                
if(bLeaveDescription&&(GetUserDescription().length()>0))
                                {
                                        return 
ChangeStatusWorker(GG_USER_STATUS_NOT_AVAIL_DESCR,GetUserDescription().c_str(),GetUserOnlyForFriends());
                                }
                                return 
ChangeStatusWorker(GG_USER_STATUS_NOT_AVAIL,NULL,FALSE);
                                break;
                        default:
                                break;
                        }
                        return CloseConnectionWorker(FALSE,bNotifyReconnect);
                }
                else
                {
                        SetLastErrorCode(GG_ERROR_CODE_INVALID_PARAM);
                }
                return FALSE;
        }
_______________________________________________
libgadu-devel mailing list
libgadu-devel@lists.ziew.org
http://lists.ziew.org/mailman/listinfo/libgadu-devel

Reply via email to