PDA

Просмотр полной версии : jabber - проблема с пакетами


eLWAux
18.02.2009, 22:39
появилось желание реализовать простой jabber клиент на perl'e.
использовать Net::XMPP и подобние я нехочу.., все делаю через IO::Socket; т.е. сам составляю пакети..

коннект (тут проблеми нету) :
my $sock = new IO::Socket::INET(
PeerAddr => 'jabber.ru',
PeerPort => 5222, #5223
Timeout => 1,
Proto => 'tcp') or
die " [-] connect \n";
print "connected!\n";

дальше отправляю первий пакет:
print $sock "<?xml version='1.0' encoding='UTF-8'?><stream:stream to='jabber.ru' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' xml:lang='ru' version='1.0'>";
while ($input = <$sock>){debug($input);}
print ($input);

и вот тут уже маленькая непонятность =\
если отправляю: ....n='1.0'> тогда нету ответа от сервера
если отправляю: ....n='1.0'/> тогда ответ примерно такой:
<?xml version='1.0'?>
<stream:stream xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'
id='1696998121'
from='jabber.ru'
version='1.0'
xml:lang='en'>
<stream:features>
<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
<compression xmlns='http://jabber.org/features/compress'><method>zlib</method>
</compression>
<mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
<mechanism>DIGEST-MD5</mechanism><mechanism>PLAIN</mechanism>
</mechanisms>
<register xmlns='http://jabber.org/features/iq-register'/>
</stream:features>
</stream:stream>

окей.. дальше отправляю второй пакет:
print $sock "<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='DIGEST-MD5'/>";
read($sock,$input,999);
print ($input);

и что я тут не менят, ответа от сервера нету =\
/>, \n, все что хочеш.., ответа нету =/

помогите пожалуйста, кто знает в чем моя проблемма)



p.s.: http://xmpp.org/ читал,
через wireshark перехватил пакети.
уже смотрел XML консоль в QIP'e.
http://forum.jrudevels.org/viewtopic.php?p=12853


p.p.s.:
вот что я перехватил с помощью wireshark (пакети QIP'а):
(зелений цвет - ответ сервера,
красний цвет - пакет qip'а)

http://s53.radikal.ru/i139/0902/87/811ab577c40at.jpg (http://radikal.ru/F/s53.radikal.ru/i139/0902/87/811ab577c40a.jpg.html)

первий пакет успешно отправляю (только конец пакета: "../>", а не "..>")
ответ после первого тоже получаю, такой что нужно.

второй пакет отправляю, а ответа нету =\

Gifts
20.02.2009, 20:51
eLWAux Вся проблема в том как раз, что ты сразу закрываешь соединение с jabber сервером.

<stream:stream to='jabber.ru' ..... [b]/[b]> Эквивалентно <stream:stream .... ></stream:stream>

Т.е. Сервер отвечает на начальный пакет, и видя закрытие тэга stream:stream - закрывает соединение

Запусти wireshark и такой скрипт#!/usr/bin/perl
use IO::Socket;

my $sock = new IO::Socket::INET(
PeerAddr => 'jabber.ru',
PeerPort => 5222, #5223
Timeout => 1,
Type => SOCK_STREAM,
Proto => 'tcp',
Blocking => 0) or
die " [-] connect \n";
print "connected!\n";
print $sock "<?xml version='1.0' encoding='UTF-8'?><stream:stream to='jabber.ru' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' xml:lang='ru' version='1.0'>";
read($sock,$input,529); # цифра взята на глазок
print ($input."\n\n------------\n\n");
print $sock "<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='DIGEST-MD5'/>";
read($sock,$input,146);
print ($input);
close ($sock);

Будет видно что сервер ответит на оба пакета

Проблема по сути - как получать ответ от сервера. Не зная перл могу предположить, что конструкция while ($input = <$sock>) - будет ждать закрытия сокета и только тогда выведет результат

Kaimi
20.02.2009, 21:45
Blocking => 0

Под XP не работает