Hejka!
Ostatnio dość intensywnie rozwijam pewien mały projekcik komunikatora XMPP (aka Jabbera) na Maczunia. Bawiąc się Cocoa przy tym dość intensywnie napotkałem na kilka poważnych niedociągnięć i chciałbym podzielić się uwagami na temat ich rozwiązania.
A nuż się komuś kiedyś przyda.
Chciałbym poruszyć kwestię klasy NSStream. Bardzo użyteczna klasunia pozwalająca dość bezboleśnie rozwiązać problemy z łączeniem się po sieci.
Jest asynchroniczna, informuje nas o wszystkim i trzyma osobno wejście i wyjście. Bardzo fajne. Jest też o tyle wygodna, że z wykorzystaniem biblioteki OpenSSL, ma obsługę SSLv1, SSLv2 i TLSv1.
Jest tylko jeden drobny problem.
Większość protokołów wykorzystujących TLS (w tym XMPP) wymaga wymiany kilku zdań, zanim przeniesie się na szyfrowane połączenie. Implementacja w NSStream jest jednak na tyle ułomna, że nie można po połączeniu wykonać “przerzucenia” się na połączenie szyfrowane (odpowiednik funkcji SSLowej SSL_do_handshake()).
Być może się mylę, ale chyba właśnie tak jest. Ja nie potrafiłem sobie poradzić.
Należy jednak podkreślić, że NSStream jest implementacją nad POSIXowym rozwiązaniem socketów.
Napisanie własnej klasy strumienia z właściwą obsługą jest kwestią paru chwil. Gdyby ktoś kiedyś miał taki problem, mogę dostarczyć gotowca ![]()
Pozdrawiam,
b.