Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Флешка не реагирует на cross-domain-policy (Ошибка 2048) ? (http://www.flasher.ru/forum/showthread.php?t=199038)

SiteLev 11.05.2013 23:24

Флешка не реагирует на cross-domain-policy (Ошибка 2048) ?
 
Доброго времени суток.

Уже несколько дней бьюсь над проблемой соединения
флешки с сервером через сокет (оба на локалхост).

Читал кажется всю необходимую информацию, даже
установил специальную программку - сервер socket policy file server
( хотя в итоге у меня сервер должен быть на php ).

Такое впечатление, что флешка не хочет воспринять
ответ <cross-domain-policy>... (хотя запрашивает <policy-file-request/>).

При попытке подключения по сокету всегда выдает ошибку securityError.

В ответе на <policy-file-request/> у меня:
Код:

<allow-access-from domain="*" to-ports="*" secure="false" />

C4Grey 12.05.2013 01:58

Программка не нужна, просто еще один сокет сервер, ожидающий policy-file-request и отпарвляющий в ответ xml-строку с политикой доступа. По умолчанию порт, на котором флеш ищет файл crossdomain.xml - 843 (ну и еще тот, к которому подключаемся). С другого порта можно загрузить так: Security.loadPolicyFile("xmlsocket://" + Host + ":" + PolicyPort); Да, и secure="false", это просто рекомендация, лучше на вермя тестирования её убрать, для "чистого" резульатата :)

SiteLev 12.05.2013 05:21

Да, да, именно так все воспринимаю,
эта програмка и есть сервер, который по идее должен выдать
ответ на 843 порте на запрос <policy-file-request/>.
Но дело в том, что когда отправляю этот ответ с помощью php сервера,
все равно ошибка не исчезает.
С помощью сервера на php отправляю
Код:

"<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>\n";
Правда, в обоих случаях не представляю как зафиксировать, факт,
что флеш получил ответ.

Korchy 12.05.2013 09:54

1. Попробуйте сделать политику отдельным файлом (кстати и удобнее править будет в случае чего). Вот, взято с адобовского сайта:

Код:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
        <allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>

2. В конце при отправке после \n добавляете еще \0
Флеш использует \0 как подтверждение конца блока данных.

SiteLev 12.05.2013 14:14

1) Да, пробовал и отдельный файл поставить на сервер, тоже не помогло.

2) Добавил \0 в конце ответа, т.е, получилось
Код:

"<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>\n\0";
Не помогло.
Заметил странность, когда флеш отправляет запрос на полиси,
мой сервер на php почему-то отключается :-) .
При отправке этого же запроса <policy-file-request/> вручную,
такого не происходит.

На всякий случай привожу код php сервера:
PHP код:

error_reporting(E_ALL);

/* Allow the script to hang around waiting for connections. */
set_time_limit(0);

/* Turn on implicit output flushing so we see what we're getting
 * as it comes in. */
ob_implicit_flush();

$address '127.0.0.1';
$port 843;//10000;

if (($sock socket_create(AF_INETSOCK_STREAMSOL_TCP)) === false) {
    echo 
"socket_create() failed: reason: " socket_strerror(socket_last_error()) . "\n";
}

if (
socket_bind($sock$address$port) === false) {
    echo 
"socket_bind() failed: reason: " socket_strerror(socket_last_error($sock)) . "\n";
}

if (
socket_listen($sock5) === false) {
    echo 
"socket_listen() failed: reason: " socket_strerror(socket_last_error($sock)) . "\n";
}

do {
    if ((
$msgsock socket_accept($sock)) === false) {
        echo 
"socket_accept() failed: reason: " socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    
/* Send instructions. */
    
$msg "\nWelcome to the PHP Test Server. \n" .
        
"To quit, type 'quit'. To shut down the server type 'sd'.\n";
    
socket_write($msgsock$msgstrlen($msg));

    do {
        if (
false === ($buf socket_read($msgsock2048PHP_NORMAL_READ))) {
            echo 
"socket_read() failed: reason: " socket_strerror(socket_last_error($msgsock)) . "\n";
            break 
2;
        }
        if (!
$buf trim($buf)) {
            continue;
        }
        if (
$buf == 'quit') {
            break;
        }
        if (
$buf == 'sd') {
            
socket_close($msgsock);
            break 
2;
        }
        
        
        if( 
strstr$buf"policy-file" ) ){ //<policy-file-request/>               
            
$talkback="<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>\n\0";             
            
socket_write($msgsock$talkbackstrlen($talkback));            
            echo 
"received:{$buf}\n";
            
//break;   
        
}else{                        
            
$talkback "You said '$buf'.\n";                        
            
socket_write($msgsock$talkbackstrlen($talkback));
            echo 
"received:{$buf}\n";
        }
                
        
    } while (
true);
    
socket_close($msgsock);
} while (
true);

socket_close($sock); 


Korchy 12.05.2013 15:53

Цитата:

Сообщение от SiteLev (Сообщение 1132880)
1) Да, пробовал и отдельный файл поставить на сервер, тоже не помогло.

Кодировка utf ?

Что значит отключается? Если обрывается соединение - так и должно быть. После получения политики сокет обрывает соединение и устанавливает по новой на назначенном порту.

Попробуйте убрать всякие "you say" и т.п. Сервер политики должен только получать запрос политики, отдавать ответ с правилами политики и закрывать соединение после отдачи. Ничего лишнего не должно быть.

SiteLev 12.05.2013 16:34

Кодировка файла crossdomain.xml utf
А во флеше у меня

Код AS3:

Security.loadPolicyFile("http://localhost/путь_к_файлу/crossdomain.xml");

Притом swf-ка тоже находится в той же папке, вместе с html страницей.

Кстати, в этом файле crossdomain.xml все символы вроде такие, что не
должно иметь значение utf.


А сервер на php действительно отключается, т.е, сама консольная программа
отключается почему-то (а не соединение) , когда флешка пытается подкючиться
по сокету :-)

Korchy 12.05.2013 17:47

Цитата:

Сообщение от SiteLev (Сообщение 1132888)
Код AS3:

Security.loadPolicyFile("http://localhost/путь_к_файлу/crossdomain.xml");


А это зачем?
Вы не путаете понятия кроссдомена и сокет-политики?
Для того чтобы подключить сокет-соединение, не нужно грузить файл политики отдельно (если он не лежит где-нибудь отдельно от сайта).

Код AS3:

var sock = new Socket();
sock.addEventListener(Event.CONNECT, OnConnect);
sock.addEventListener(SecurityErrorEvent.SECURITY_ERROR, OnSecurityError);
sock.connect(MyHosht,Port); // хост, порт

Все, больше ничего не нужно. Сокет сам опросит сервер по 843 порту на предмет получения файла политики, если получит - он сам переподключится на указанный порт и дистпатчнет событие OnConnet, если нет - просто бросит OnSecurityError

Ну и проверяйте свой php сервер. Раз он отключается при попытке коннекта, значит определенно имеет какие-то проблемы.

SiteLev 12.05.2013 18:18

Ок, спасибо
Действительно с php у меня видимо что-то нито,
потому, что там не нормально работает также код записи лога в файл.


Но вопрос в том, что я в начале использовал для ответа полиси
не php, другой сервер специальный для флеша (называется Socket policy file server ).
Тоже не исчезает ошибка securityError.

Код подключения сокета во флешке у меня примерно такой же, как у Вас.

Код AS3:

var s:Socket = new Socket( host, port );                        
s.addEventListener(ProgressEvent.SOCKET_DATA, sData );                       
s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, secuerror);
 
function secuerror(event:SecurityErrorEvent):void
{
          trace(event);//Получаю SecurityErrorEvent type="securityError"... Error #2048
 
}


Вот сейчас слушаю порт 843.
при подключении сокета пришел запрос <policy-file-request/>
и потом соединение сразу же разорвано со стороны
клиента (флешки очевидно).

Флешка наверно не должна была так быстро сбрасывать соединение?

Добавлено через 28 часов 29 минут
Сменил номер порта подключения с 1000 на 12000,
ошибка (securityError ) исчезла.

Огромное спасибо за ответы :-)


Часовой пояс GMT +4, время: 14:56.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.