Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Нужна помощь в настройке Apache + PHP сокет + AS (http://www.flasher.ru/forum/showthread.php?t=112786)

wvxvw 07.06.2008 18:56

Нужна помощь в настройке Apache + PHP сокет + AS
 
Не могу понять как настроить апач, чтобы при попытке коннекта на 843 порт отдавался crossdomain.hml =(
В httpd.conf добавил Listen 843
в корневой директории лежит такой вот пхп:
Код:

<?php
// set some variables
$host = "127.0.0.1";
$port = 843;
$log = fopen("socket_log.txt", "w");
fwrite($log, "Socket log: status 0\n");
fclose($log);

// don't timeout!
set_time_limit(0);
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
if (!$socket) {
        $log = fopen("socket_log.txt", "w");
        fwrite($log, "Could not create socket\n");
        fclose($log);
        exit();
}
// bind socket to port
$result = socket_bind($socket, $host, $port);
if (!$result) {
        $log = fopen("socket_log.txt", "w");
        fwrite($log, "Could not bind to socket\n");
        fclose($log);
        exit();
}
// start listening for connections
$result = socket_listen($socket, 3);
if (!$result) {
        $log = fopen("socket_log.txt", "w");
        fwrite($log, "Could not set up socket listener\n");
        fclose($log);
        exit();
}
// accept incoming connections
// spawn another socket to handle communication
$spawn = socket_accept($socket);
if (!$spawn) {
        $log = fopen("socket_log.txt", "w");
        fwrite($log, "Could not accept incoming connection\n");
        fclose($log);
        exit();
}
// read client input
$input = socket_read($spawn, 1024);
if (!$input) {
        $log = fopen("socket_log.txt", "w");
        fwrite($log, "Could not read input\n");
        fclose($log);
        exit();
}
// clean up input string
$input = trim($input);

// reverse client input and send back
$output = "<?xml version=\"1.0\"?>
<!DOCTYPE cross-domain-policy SYSTEM \"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\">
<cross-domain-policy>
        <allow-access-from domain=\"*\" to-ports=\"843,1234\" />
</cross-domain-policy>";
$out = socket_write($spawn, $output, strlen ($output));
if (!$out) {
        $log = fopen("socket_log.txt", "w");
        fwrite($log, "Could not write output\n");
        fclose($log);
        exit();
}
// close sockets
//socket_close($spawn);
//socket_close($socket);
?>

А так выглядит класс, который должен к нему коннектится:
Код:

package 
{
       
        /**
        * ...
        * @author wvxvw
        */
        import flash.events.IOErrorEvent;
        import flash.events.ProgressEvent;
        import flash.events.SecurityErrorEvent;
        import flash.net.Socket;
        import flash.utils.ByteArray;
        import flash.external.ExternalInterface;
        import flash.system.Security;
        import flash.events.Event;
       
        public class PNGSocket
        {
                private var sc:Socket;
                private var ba:ByteArray;
               
                public function PNGSocket()
                {
                        Security.loadPolicyFile("xmlsocket://127.0.0.1/sock_crossdomain.php");
                        sc = new Socket('127.0.0.1', 843);
                        sc.connect('127.0.0.1', 843);
                        sc.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
                        sc.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
                        sc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
                        sc.addEventListener(Event.CONNECT, connectHandler);
                }
                public function sendPNG(b:ByteArray = null):void
                {
                        ba = new ByteArray();
                }
                private function socketDataHandler(evt:ProgressEvent):void
                {
                        trace('data recieved: ' + evt);
                        ExternalInterface.call('alert', 'DATA');
                }
                private function ioErrorHandler(evt:IOErrorEvent):void
                {
                        trace('connection error: ' + evt.text);
                        ExternalInterface.call('alert', 'IO ERROR');
                }
                private function securityErrorHandler(evt:SecurityErrorEvent):void
                {
                        trace('security error: ' + evt.text);
                        ExternalInterface.call('alert', 'SECURITY ERROR\r'+evt.text);
                }
                private function connectHandler(evt:Event):void
                {
                        trace('connection established: ' + evt);
                        ExternalInterface.call('alert', 'CONNECTION');
                        sc.writeUTF("Hi!");
                }
        }
       
}

Врезультате, тестируя из ФД получаю такой вот оутпут:
connection established: [Event type="connect" bubbles=false cancelable=false eventPhase=2] // sc.writeUTF("Hi!"); ничего не посылает либо ПХП ничего не возвращает =/ Самое удивительное то, что ПХП в любом случае лог не пишет (но если просто обратиться к нему из браузера, то лог будет создан)
Через браузер - секьюрити еррор...

etc 07.06.2008 21:32

Через xmlsocket:// указывается только хост, а не имя файла.

wvxvw 08.06.2008 00:18

Хм... ок, оказалось, что как раз httpd.conf трогать не надо было...
имя файла убрал, вообще убрал Security.loadPolicyFile() она все равно вызывается. Все равно, пока что результатов никаких =(
Сделал ненмого по-другому: флеш сначала посылает запрос сюда http://127.0.0.1/sock_crossdomain.php (этот файл должен запустить сокет), а дальше пытается законектится на все тот же 843 порт... естесственно, ошибка безопасности...

Да, и еще, если я просто пытаюсь из строки браузера запустить пхп - получаю следующую ошибку:
Цитата:

[Sat Jun 07 21:19:18 2008] [error] [client 127.0.0.1] PHP Warning: socket_bind() [<a href='function.socket-bind'>function.socket-bind</a>]: unable to bind address [0]: Only one usage of each socket address (protocol/network address/port) is normally permitted.
in C:\www\sock_crossdomain.php on line 20

Alex Lexcuk 08.06.2008 00:33

А, можно поподробнее, что должно получится, когда ето все будет работать?
Сокеты служат для передачи данных по сети. С их помощью можно общаться с портами удаленного сервера. Работа с сокетами подобна работе с файлами в РНР.

А это что за фича
Код:

$log = fopen("socket_log.txt", "w");
        fwrite($log, "Could not accept incoming connection\n");
        fclose($log);
        exit();

Чтобы открыть сокет, следует использовать функцию
fsocketopen();
например
Код:

$sp=fsockopen("dnadillo.dn.ua",80);
Я такие фишки пробовал делать, они ни фига не работают, нужно откомпилировать флешку засунуть ее на виртуальный сайт и запускать через адресную строку.
Например
dnadillo.dn.ua/my_swf.swf
И она будет подгружать в себя все что угодно из того что расположено на сайте dnadillo.dn.ua

wvxvw 08.06.2008 01:58

Вложений: 1
Это не фишка... просто в файл пишется лог о том, что смог/не смог сделать скрипт...
И этот скрипт никогда не будет доступен по сети, только локально, это его предназначение... т.е. флешка используется для того, чтобы рендерить картинки и посылать их "по почте" на сохранение.
Т.е. в итоге, что мне нужно сделать:
шаг 1: запустить из флешки скрипт, который в свою очередь запустит сокет.
шаг 2: дожаться сообщения, что сокет запущен и подключится к нему.
шаг 3: послать картинку -> дождаться сообщения, что картинка сохранилась, и так очень много раз =)
шаг последний: сообщить сокету, что нужно закрыться.

Т.е. все то же самое я могу сделать ХТТП запросами... но это маразм, т.как на каждую картинку прийдеться отправлять по 2 запроса (1 с параметрами название файла, номер сессии и т.п.) второй уже с самой картинкой. Кроме того, в идеале будет реализован мультитрединг... а это значит, что запросы могут легко перепутаться и тогда понеслась... Либо, немного улученный вариант - в байтарей с картинкой дописывать все те же название, сессию и т.п. но все равно, куча лишнего мусора будет пересылаться...
Сокет был бы оптимальным решением т.как большинство параметров идентичны, и на самом деле мне нужно их послать 1 раз в начале, и посигналить, когда все картинки одного типа были высланы...

ЗЫ. Конечная реализация все равно будет на АСПХ, но мне пока для тестов надо ПХП =( не то, чтобы я его хорошо знал, но АСПХ - вообще темный лес, да и я повешусь у себя дома еще и ИИС поставить со всем .НЕТовским фреймворком...

Единственное, что точно работает - при попытке обратиться к http://127.0.0.1:843 приходит вот это
Код:

<?xml version="1.0" ?>
  <!DOCTYPE cross-domain-policy (View Source for full doctype...)>
- <cross-domain-policy>
  <allow-access-from domain="*" to-ports="843,1234" secure="false" />
  </cross-domain-policy>

Вложение 19718

В итоге доработался до такого... вопрос, как у меня могло это получиться, если сокет всего 1? =\

Цитата:

Error #2044: Unhandled SecurityErrorEvent:. text=Error #2048: Security sandbox violation: http://127.0.0.1/try_socket.swf cannot load data from http://127.0.0.1:1234.
at PNGSocket/socketStarted()[C:\www\classes\PNGSocket.as:59]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
Ну вот как такое может быть...
и при этом если пойти по ссылке http://127.0.0.1:1234 в браузер выдается именно такой crossdomain.хml, как указано в доках... =(

etc 08.06.2008 13:58

Должен быть запущен сокет-сервер, а не http-сервер на 843-ем порту.

Сайлас 08.06.2008 14:10

Кстати, насколько я знаю, тот же апач при определенной сборке может быть сокет-сервером.
Самому проблема стала интересна :) Если получится настроить нормально работающий клиент-сервер с апачем на сокетах, то хотелось бы, чтобы решение показали (если оно, конечно коммерческим секретом не является :) )

wvxvw 08.06.2008 16:25

Цитата:

Сообщение от __etc (Сообщение 744478)
Должен быть запущен сокет-сервер, а не http-сервер на 843-ем порту.

угу... осознание этого пришло только на вторые сутки %)

Сайлас:
не, то что я делаю - исключительно для себя, для тестов, так что если получится - конечно покажу =)

ЗЫ. Самое обидное, что на каком-то этапе в трейсе появилось сообщение о том, что сокет приконектился... но как я это сделал...

Но, похоже, что все-таки можно научить апач принимать нестандартные сообщения по TCP... нужно добавить handler"ы, которые бы объясняли, что нужно делать, если пришел нестандартный http заголовок... но это все теория... на практике это значит, что мне нужно будет сейчас переинстолить ПХП как SGI скрипт, да и все равно не факт, что это будет работать... вобщем, похоже прийдеться кого-то из знакомых просить, чтобы на C/Javе сервер написали...

BlooDHounD 08.06.2008 18:49

апач и есть сокет сервер :) слушает он 80й портю вообще ХТТП этот тоже сокет, просто он закрывается сразу после запроса. и запрос имеет специфичный вид.

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

etc 08.06.2008 19:23

Цитата:

Сообщение от BlooDHounD (Сообщение 744522)
апач и есть сокет сервер :) слушает он 80й портю вообще ХТТП этот тоже сокет, просто он закрывается сразу после запроса. и запрос имеет специфичный вид.

Это понятно. Только в понимании большинства флешеров сокет-сервер суть не http-сервер, а кастомный. То, что технически и то и другое по одному принципу работает, не имеет никакого значения.


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

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