Re: [libgadu-devel] DCC7 - implementacja wysyłania plików przez serwer.

2011-04-15 Thread Wojtek Kaniewski
Dnia 2011-04-15, pią o godzinie 13:55 +0200, Rafał Malinowski pisze:
 Mam pewien problem z opisem protokołu :) Konkretnie z tym działem:
 http://toxygen.net/libgadu/protocol/#ch3.4 i z opisem przeplatanki
 GG_DCC7_INFO z pobieraniem adresu serwera pośredniczącego.
 Jeżeli dobrze rozumiem, to w tym momencie libgadu powinno wykonywać
 równocześnie 2 połączenia:
 - na głównym sockecie wysłać informacje na temat GG_DCC7_INFO
 - na nowo otwarytym sockecie DCC łaczyć się z relayem i odebrać adres serwera?
 
 Próbowałem wczoraj to zaimplementować, jednak nie rozumiem jeszcze
 zbyt dobrze kodu libgadu i nie wiem jak otworzyć równocześnie drugie
 połączenie. Być może należałoby to rozwiązać w ten sposób, że po
 wysłaniu GG_DCC7_INFO powinienem otworzyć nowy socket DCC i odebrać
 relaya i przekazać go jako DCC_PENDING do klienta (Kadu), żeby on już
 sobie na nim gg_dcc7_watch_fd robił?

Niestety obsługa DCC7 w oryginalnym kliencie się trochę skomplikowała.
Kiedyś wyglądało to mniej więcej tak, że jedna strona najpierw otwierała
gniazdo, wysyłała GG_DCC7_INFO i czekała na połączenie. Druga strona po
otrzymaniu adresu i portu próbowała się połączyć, ale jeśli się nie
udało, to sama otwierała gniazdo i wysyłała do inicjującego. Dopiero
jeśli to się nie udało, zaczynało się połączenie przez serwer.

Z tego co widzę, teraz obie strony od razu otwierają gniazda, wysyłają
GG_DCC7_INFO _oraz_ zaczynają gadanie z serwerem pośredniczącym. Nie
pasuje to w ogóle do architektury libgadu, gdzie jedno połączenie rządzi
jednym deskryptorem. Powoduje to problemy w komunikacji libgadu z GG10,
gdy libgadu najpierw wysyła GG_DCC7_INFO z namiarami na otwarty port,
ale gdy otrzyma te informacje od drugiej strony, zamyka swoje gniazdo i
łączy się z podanym. GG10 czasami pokazuje, że połączenie anulowano,
co wygląda na wyścig związany z zamykaniem gniazda, z którym GG10
zdążyło się już połączyć. Jeśli do tego jeszcze dodać połączenie przez
serwer... robi się trochę skomplikowanie.

Macie może jakieś pomysły jak to rozwiązać w inny sposób niż dodanie
pól .fd2 i .fd3 w strukturze gg_dcc7? ;) Wcześnie myślałem o tym, żeby
po otrzymaniu GG_DCC7_INFO nie zamykać lokalnego gniazda, ale do .fd
wrzucić deskryptor połączenia do drugiej strony z timeout = 1 i
soft_timeout = 1, co pozwoliłoby nam z sekundowym opóźnieniem obsłużyć
połączenia przychodzące. Tyle, że trzymanie się API na siłę takim
kosztem chyba nie ma sensu.

Pozdr,
Wojtek

___
libgadu-devel mailing list
libgadu-devel@lists.ziew.org
http://lists.ziew.org/mailman/listinfo/libgadu-devel


Re: [libgadu-devel] DCC7 - implementacja wysyłania plików przez serwer.

2011-04-15 Thread Rafał Malinowski
To by znaczyło, że nasze SocketNotifiery musiaby nasłuchiwać na kilku
gniazdach na raz... IMHO nowe API było by przydatne, niestety nie mam
najmniejszego pojęcia, jak mogłoby wyglądać. Może należałoby parować
struktury dcc7 z jakimiś nowymi strukturami relay7 i sprawdzać je
obie?
___
libgadu-devel mailing list
libgadu-devel@lists.ziew.org
http://lists.ziew.org/mailman/listinfo/libgadu-devel