появилось желание реализовать простой jabber клиент на perl'e. использовать Net::XMPP и подобние я нехочу.., все делаю через IO::Socket; т.е. сам составляю пакети.. коннект (тут проблеми нету) : Code: my $sock = new IO::Socket::INET( PeerAddr => 'jabber.ru', PeerPort => 5222, #5223 Timeout => 1, Proto => 'tcp') or die " [-] connect \n"; print "connected!\n"; дальше отправляю первий пакет: Code: 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'/> тогда ответ примерно такой: Code: <?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> окей.. дальше отправляю второй пакет: Code: 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'а) первий пакет успешно отправляю (только конец пакета: "../>", а не "..>") ответ после первого тоже получаю, такой что нужно. второй пакет отправляю, а ответа нету =\
eLWAux Вся проблема в том как раз, что ты сразу закрываешь соединение с jabber сервером. <stream:stream to='jabber.ru' ..... /> Эквивалентно <stream:stream .... ></stream:stream> Т.е. Сервер отвечает на начальный пакет, и видя закрытие тэга stream:stream - закрывает соединение Запусти wireshark и такой скрипт PHP: #!/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>) - будет ждать закрытия сокета и только тогда выведет результат