crossdomain actionscript policy-file-request

есть сервер написаный на с++

и клиент на екшнскриптах... только серверу все время приходит policy-file-request...

crossdomain куда только не пихал... и в корень сайта ы не в корень... все равно приходит policy-file-request... тестирую я на двох ноутах связаных по ВАЙ-ФАЙ... сайт находится не в папке WWW a v papke SUBDOMAIN (может в этом проблема)...


<?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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFileSocket.xsd">
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Те же проблемы, только сервер пишу на питоне. Нашли решение?

to THE ONE
дай мне пожалуйста свой емейл...

не бойся, я на почту вопросы писать не буду))

ну что тут сказать... спасибо...
ошибок было несколько
1) порт 8080 для этого дела не катит...

2) кросдомейн считывался с файла, а потом кидался в сокет... (не знаю в чем причина, но так тоже не выходит)

если проблема будет продолжаться то заваершаркай траф — по нему можно будет найти ошибку.


1) спасибо что так стараешся нам помочь!!!
2) на какой crossdomain.xml взглянуть... свой вариант я ведь вылаживал раньше.
3) пришли если не сложно свой вариант crossdomain.xml и код сервака...
(и все что считаеш важным тоже шли)
1) была интересна проблема, подумал что адоби что-то новое добавил
2) прости, забыл что в первых постах файл был опубликован.

3) он на C, но думаю что с ассемблером в профиле; -) тебе не сложно будет разобраться. реализация приёма/передачи данных слегка неправильная т.к. пакеты могут побиться, но для данного примера хватило. в своём примере я пользовал порт 27015, поэтому надо будет исправить его. сервер может работать и на одном порту, но если нужен будет 843 то разкоментируй _beginthread в функции мейн., а ещё в клиенте, в функции onconnect надо добавить вот что:


		function socket_connected(event:Event):void
		{
			L('socket_connected');
			var teststr:String = "test string";
			socket.writeMultiByte(teststr, "iso-8859-1");
			socket.writeByte(0);
		}

сервер:


#include <windows.h>
#include <stdio.h>
#include <process.h>

LPCSTR PolicyFile =
	"<cross-domain-policy>\n"
	"<site-control permitted-cross-domain-policies=\"all\"/>\n"
	"<allow-access-from domain=\"*\" to-ports=\"27015\" />\n"
	"</cross-domain-policy>";

LPCSTR FromServer =
	"string from server\n";

void Listen(int port);

int main()
{

//_beginthread((void(*)(void *))Listen, 0, (void*)843);
	Listen(27015);

return 0;
}

void Listen(int port)
{

// Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");

// Create a socket.
    SOCKET m_socket;
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

if ( m_socket == INVALID_SOCKET ) {
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return;
    }

// Bind the socket.
    sockaddr_in service;

service.sin_family = AF_INET;
    service.sin_addr.s_addr = INADDR_ANY;
    service.sin_port = htons( port );

if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
        printf( "bind() failed.\n" );
        closesocket(m_socket);
        return;
    }

// Listen on the socket.
    if ( listen( m_socket, 1 ) == SOCKET_ERROR )
        printf( "Error listening on socket.\n");

// Accept connections.
    SOCKET AcceptSocket;

printf( "Waiting for a client to connect on %d...\n", port );
    while (1) {
        AcceptSocket = SOCKET_ERROR;
        while ( AcceptSocket == SOCKET_ERROR ) {
            AcceptSocket = accept( m_socket, NULL, NULL );
        }
        printf( "[%d] Client Connected.\n", port);

CHAR szRequest[256];
		iResult = recv(AcceptSocket, szRequest, sizeof(szRequest), 0);
		if(iResult <= 0)
		{
			printf("[%d] recv failed\n", port);
			closesocket(AcceptSocket);
			continue;
		}
		printf( "[%d] received: %s\n", port, szRequest);
		if(!stricmp(szRequest, "<policy-file-request/>"))
			iResult = send(AcceptSocket, PolicyFile, (int)strlen(PolicyFile) + 1, 0);
		else
			send(AcceptSocket, FromServer, (int)strlen(FromServer) + 1, 0);

closesocket(AcceptSocket);

}

}


1) спасибо что так стараешся нам помочь!!!
2) на какой crossdomain.xml взглянуть... свой вариант я ведь вылаживал раньше.
3) пришли если не сложно свой вариант crossdomain.xml и код сервака...

(и все что считаеш важным тоже шли)

проверил твой пример, у меня с кастомным серваком (взятого из мсдн) работает нармально, проверял как и ты на двух хостах

неплохо было бы посмотреть на crossdomain.xml.

если сервак 127.0.0.1 то всё работает?

флешка работает нормально... выдает что подключилась к серваку..., но только на локальном компютере. (на сервере)., а в браузере нет... выдает security error.и такие же еррор с компютера с сети.

если сервак 127.0.0.1 то всё работает?


т.е. ты пробывал запаблишить в хтмл страницу, выложить её на апаче, на другом компе зайти из эксплорера на апач на страницу с свф файлом?

да... так и есть...

должно было работать

да… мы тоже так думали…

т.е. ты пробывал запаблишить в хтмл страницу, выложить её на апаче, на другом компе зайти из эксплорера на апач на страницу с свф файлом?

должно было работать, 2048 именно с этим должна быть связана.

пробывали подсоединятся к апачи на 80-й порт — то же самое...

пробовали грузить по сети... те же ошибки...

попробуй вот что. попробуй запаблишить свой свф файл на хттп сервак на хосте B, после чего загрузи его как реально по сети и посмотри что будет.
если хочешь запускать локально то попробуй добавить директорию в трастед.

ЗЫ. так почему именно кастомный сервер? может все решается через хттп протокол?

да... только ошибка_1 выдается на клиенте (с айпи 12.12.12.2) при компиляции в студии (Adobe Flash cs4)... в браузере выдается только ошибка_2...

забыл спросить, а в броузере swf файл загружается с сервера на который он потом коннектится?

или как я понял из ошибок, swf файл загружается локально на компьютере A, после чего пытается приконнектиться на сервер компьютера B?

а зачем именно кастомный сервер вместо стандартного хттп?

ЗЫ. надо подумать что за проблема.

to THE ONE
1) есть полностью рабочий сервер-демон написаный на ПХП. проверялся телнетом. он может принимать данные и отсылать их... он работает на двох портах: 8080 и 843.

2) есть клиент написаный на екшнскриптах 3.0 который связывается с сервером по порту 8080... (а за умолчанием он связывается и по порту 843)... связь с сервером устанавливается на обеих портах. По порту 843 (автоматически) серверу приходит строка < policy-file-request/>, сервер ее обрабатывает и отсылает слиенту содержимое кроссдомейновского файла (он менялся у меня сто раз... пробывал ставить все варианты, которые находил в интернете)..., но в сейчас он у меня такой...


<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "www.macromedia.com/…main-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="lion69" to-ports="*" />
<allow-access-from domain="12.12.12.1" to-ports="*" />
</cross-domain-policy>

3) запускаю клиет... на сервере видно что связь есть... но вылетают непонятные ошибки....

ошибка_1:

*** Нарушение безопасности изолированной среды ***
Подключение к 12.12.12.1:8080 прервано – нет разрешения от file:////12.12.12.1/c/xampp/htdocs/mic/client%5Fnew.swf

непонятная ошибка.... потому что непонятно почему он хочет достучатся к этому файлу....

ошибка_2:

security error[SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048: Нарушение изолированной среды: file:////12.12.12.1/c/xampp/htdocs/mic/client%5Fnew.swf не может загрузить данные из 12.12.12.1:8080."]

в браузере выдает только ошибку_2.

в флеше пробывал писать такую строку


//Security.allowDomain(ip);
//Security.loadPolicyFile("http://"+ip+"/crossdomain.xml");

не помогает... решил закоментировать...

привожу пример своей флешки


var ip = '12.12.12.1';
var DELAY = 3000;
var socket:Socket;
L('L');
//Security.allowDomain(ip);
//Security.loadPolicyFile("http://"+ip+"/crossdomain.xml");
//Security.loadPolicyFile("//12.12.12.2/c/mysql/home/x.x/subdomain/crossdomain.xml");
myConnect(ip, 8080);
function myConnect(ip:String,port:int):void
{
	if(ip && port)
	{
		socket = new Socket(ip,port);
		socket.connect(ip,port);
		add_events();
	}
}
function L(str)
{
	myText.appendText(str+"\n");
	trace(str);
}
function add_events():void
{
	socket.addEventListener(Event.CONNECT,socket_connected);
	socket.addEventListener(ProgressEvent.SOCKET_DATA,data_receiving);
	socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
	socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
}

function securityErrorHandler(event:SecurityErrorEvent):void
{
	trace("security error"+event)
	L("security error"+event);
}

var flag_connected = 0;
function socket_connected(event:Event):void
{
	if(!flag_connected)
	{
		flag_connected = 1;
		L('socket_connected');
	}
}

function ioErrorHandler(event:IOErrorEvent)
{
	trace('some error was occured'+event);
	L('some error was occured'+event);
}

var data_bytes:ByteArray = new ByteArray();
function data_receiving(event:ProgressEvent):void
{
	//socket.readBytes(data_bytes,0,socket.bytesAvailable);
	L("data = "+data_bytes.toString());
	//data_bytes.uncompress(CompressionAlgorithm.DEFLATE);
	//socket.flush();
}

привожу пример сервера на пхп


class PolicyServerClient extends socketServerClient
{

public $DATA  = "";

public function on_read()
        {

$data = $this->read_buffer;
                $this->read_buffer  = '';

$this->DATA.=$data;

if(strpos($this->DATA, '<policy-file-request/>')>=0)
				{
					$this->write(file_get_contents('crossdomain.xml'));
					$this->write(0);
					$this->DATA='';
					L("policy-file-request from 843!!!!!");
				}

//L("".$this->DATA."");
				//L($this->DATA);

/*
                //if(false !== strpos($this->read_buffer,""))
               //{
                        $data = trim($this->read_buffer);
                        $this->read_buffer  = '';
                        if($data == '<policy-file-request/>')
                        {
                                echo 'Policy file request! Return the crossdomain.xml'."\n";
                                //$this->write(file_get_contents('crossdomain.xml'));
								$this->write("121212");

}
                //}
				*/
        }
		public function on_connect()
        {
				L("$this->remote_address connected to 843");//просто трейс
        }
        public function write($buffer, $length = 4096)
        {
                return parent::write($buffer, $length);
        }

а что в трейсах плеера? и как вообще происходит запуск плеера?

нужно описание всей системы, как она работает.

а в чём проблема? не приходят и не уходят данные?

да..., но все равно не хочет работать...


в с++ коде отправляется вся строка с этим ХМЛ файлом... моему флешу...

это вы имели в виду... или я что то не понял...?

да, это я и имел в виду. ты/вы разницы нет.

а символом 0 завершается строка?

в с++ коде отправляется вся строка с этим ХМЛ файлом... моему флешу...

это вы имели в виду... или я что то не понял...?

надо в ответ на запрос отправлять.

Підписатись на коментарі