PDA

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


Онтожка
12.03.2008, 21:45
Значит, нашёл в интернете код для сокет-сервера на Perl:

# This is an XMLSocket multiuser server, for use with Flash 5
# If you don't know what XMLSocket is, you shouldn't be using
# this program.

use IO::Socket;
use IO::Select;

# Set the input terminator to a zero byte string, pursuant to the
# protocol in the flash documentation.
$/ = "\0";

# Create a new socket, on port 7777
$lsn = new IO::Socket::INET(Listen => 1,
LocalPort => 7777,
Reuse => 1,
Proto => 'tcp' )
or die ("Couldn't start server: $!");

# Create an IO::Select handler
$sel = new IO::Select($lsn);

# Close filehandles

close(STDIN); close(STDOUT);

warn "Server ready. Waiting for connections . . . \n";

# Enter into while loop, listening to the handles that are available.
while( @read_ready = $sel->can_read ) {

foreach $fh (@read_ready) {
# Create a new socket
if($fh == $lsn) {
$new = $lsn->accept;
$sel->add($new);
push( @data, fileno($new) . " has joined.");
warn "Connection from " . $new->peerhost . ".\n";
}

# Handle connection
else {
$input = <$fh>;

chomp $input;
if ( $input eq '') {
push( @data, fileno($fh) . " has left.");
warn "Disconnection from " . $new->peerhost . ".\n";
$sel->remove($fh);
$fh->close;
}
else {
$output = fileno($fh) . ": $input";
push( @data, $output );

}
}

}

# Write to the clients that are available
foreach $fh ( @write_ready = $sel->can_write(0) ) {
foreach $line (@data) {
print $fh "$line \0";
}
}

undef @data;

}

warn "Server ended.\n";

При тестировании из Flash IDE сервер работает нормально, то есть в консоли выводятся такие сообщения:

Connection from 127.0.0.1 -- при подключении
Disconnection from 127.0.0.1 -- при отключении


Если же тестировать из браузеров то вывод будет таким:

Connection from 127.0.0.1 -- при подключении
Disconnection from 127.0.0.1
Connection from 127.0.0.1

Disconnection from 127.0.0.1 -- при отключении


То есть сокет подключается, сразу же отключается, а потом опять подключается... В этом собственно вопрос - почему так происходит и как это исправить?

LinuxVideo
13.03.2008, 00:22
Прибить аутпост, это один из его глюков
Если его нет, то смотреть трафик

Онтожка
01.04.2008, 02:21
Проблема решена, это всё из-за новых секьюрити-фич девятого плеера (редиски эти адобы, редиски! ;).

По сути: при подключении хмл-сокет требует policy-файл с настройками о том, каким доменам и на какие порты можно коннектиться, но требует не просто там ссылку на policy-файл, а хочет чтобы ему сожержимое этого policy-файла по сокетному же соединению и передали, после этого сокетное соединение в любом случае закрывается (отсюда это connect-disconnect-connect), а далее флэш-плеер уже смотрит по policy-файлу - можно ли подсоединяться с указанными параметрами или нет.


В общем проблему можно решить двумя способами - либо настроить сокет-сервер так, что он будет с начала отрабатывать policy-запрос, а потом уже работать в нормальном режиме, либо нужно делать 2 соект-сервера, которые работают на 2 разных потрах (1-й просто возвращает policy-файл, второй - нормальный сокет-сервер), потом флэш-плееру дать указание грузить policy-файл с одного порта, а коннектиться уже к другому, вот так:

System.security.loadPolicyFile("xmlsocket://www.site.com:2000");
socket.connect('www.site.com', 2001);