Форум 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-сервер, а кастомный. То, что технически и то и другое по одному принципу работает, не имеет никакого значения.

BlooDHounD 08.06.2008 19:45

__etc, серьёзно? тогда они не флэшеры, и скорее всего никогда не станут ими.

etc 08.06.2008 21:58

Цитата:

Сообщение от BlooDHounD (Сообщение 744533)
__etc, серьёзно? тогда они не флэшеры, и скорее всего никогда не станут ими.

Кому надо — все поняли. Кроме тебя.

BlooDHounD 08.06.2008 22:21

__etc, и чего же я не понял ? :) того что большенство людей называют вещи не своими именами? и поэтому мне нужно под них подстраиваться?

etc 08.06.2008 22:56

Цитата:

Сообщение от BlooDHounD (Сообщение 744546)
поэтому мне нужно под них подстраиваться?

Как ни странно, в данном случае да.

wvxvw 08.06.2008 22:56

Млин, ну чего вы к названиям цепляетесь?
Я не знаю, возможно, скажу что то банальное, но, это ессно понятно, что HTTP это надстройка над TCP, и что 80 порт, который традиционно исползуется для пересылки таких же традиционных сообщений, типа GET, POST и т.п - то же своего рода сокет, но, по очевидным причинам, меня его функциональность не устраивает - мне как раз таки не надо посылать традиционные HTTP заголовки, и не нужно, чтобы он закрывался сразу после получения сообщения.
Т.е. скажем так, что задача, возможно решаема, но мне не хватает знаний о структуре сервера, чтобы настроить его так, чтобы получив нетрадиционный запрос (по TCP) - <policy-file-request/>, сервер не выдал бы ошибку, а перенаправил бы запрос на выполнение скрипту, который должен обслуживать это соединение. (что вобщем-то он и делает, если получает по тому же TCP сообщение типа GET <filename>?parameres - это и есть реализация HTTP).
Возможно, если бы я нашел мануал, который объясняет, как научить апач реагировать на нетрадиционные TCP сообщения - у меня бы и получилось, но факт, искал долго и упорно, ничего внятного не нашел, поэтому, наверное, от затеи прийдеться отказаться =(

Сайлас 08.06.2008 22:57

Цитата:

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

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

Ну может до уровня TCP/IP дойдем, а или физической реализации протокола передачи данных?
Ну или, к примеру, до какой-нибудь реализации динамического выделения памяти во флэше под массивы - все же флэшеры должны знать?
Для задающего вопрос не важно, что, суть представляет из себя стандартный апач http-сервер, важно то, что для общения по http есть один инструментарий, а для сокетов - другой. Важно, что http рвет запрос сразу же, а сокет держит и т.п.

BlooDHounD 08.06.2008 23:32

__etc, если вдруг все начнут считать землю раем, она от этого в него превратится?

Сайлас, если от этого будет зависит работа друго отдела, то да. а пока "клиент" не может жить без "сервера", клиентщикам придётся разбираться в том что им навязывают серверники. вот обратная совместимость совсем не обязательна.

Цитата:

Важно, что http рвет запрос сразу же, а сокет держит
Важно то, что http - это протокол, а сокет - нет.

Сайлас 08.06.2008 23:43

Цитата:

Важно то, что http - это протокол, а сокет - нет.
Кому важно?
Если задача многогранная и связана не с флэшом, а с работой самих протоколов и интерфейсов, тогда да.
А для абстрактного флэшера, разработчика высокого уровня (очень высокого), не важно. Есть работа по сокетам, а есть по хттп и в данном случае - это одного поля ягода.
Можно привести много примеров из жизни, когда 2 слова в одном случае абсолютно несравнимы, а в другом наоборот.

P.S. При этом это не в коем случае не плохо, что вы знаете, что хттп-протокол, а сокет-интерфейс, только не обязательно везде это использовать :) Мы же тут не пытаемся использовать знание местонахождения точки G ;)

BlooDHounD 09.06.2008 00:04

О!? а что по вашему "разработчик высокого уровня"? разработчик, который расставляет картинки во флэше? или вы считаете, что рас челове пишет онлайн приложение, ему совсем необязательно знать как работает интернет? или вы считает что такому человеку не нужно указывать на его ошибки? тогда он никогда не вырастет, и зачем он припёрся на форум искать помощь, если она его ничему не научит? чем глубже человек спускается по ступенькам в бассейн программирования, тем выше у него ЗП.

Сайлас 09.06.2008 00:12

Ладно, вы видимо не хотите понять о чем речь, думаю, что нужно закончить спор, т.к. абсолютно не по теме и не приведет ни к чему

Я же не зря P.S. написал:
Цитата:

P.S. При этом это не в коем случае не плохо, что вы знаете, что хттп-протокол, а сокет-интерфейс, только не обязательно везде это использовать Мы же тут не пытаемся использовать знание местонахождения точки G
А вы говорите:
Цитата:

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

alexcon314 09.06.2008 00:13

http://flasher.ru/forum/showthread.php?t=103931
Здесь человек пытался сделать что-то похожее. Правда, по-началу в обсуждении было некоторое недопонимание в том плане что речь идет об AS3. Но тут как раз к месту. Как я помню, народ пришел к мысли, что заставить апач работать с AS3-сокетом можно и на 80-ом порту, привешивая соответствующий заголовок в запрос. Т.е. если я все правильно понял, запрос как раз-таки должен быть ТРАДИЦИОННЫМ. Но в общем и целом все это зыбко как-то, хотя принципиально возможно. Зато перспектива есть, потому не надо отказываться. Вопрос интересный. Настраивать апач на нетрадиционные заголовки однозначно - утопия.
Заюзать самописный сокет-сервер гораздо проще. Хотя.. хостеры.. прокси..межсетевые экраны..

...
Да, еще. Я почему-то обратил внимание на трэйс-рисунок от FD видимо.. Собственно, мне стало интересно откуда там вылезли .NET классы? Я знаю, что FD написан на .NET, но при чем тут флэш-сокеты?

badun 09.06.2008 01:23

Цитата:

Сообщение от alexcon314 (Сообщение 744564)
Да, еще. Я почему-то обратил внимание на трэйс-рисунок от FD видимо.. Собственно, мне стало интересно откуда там вылезли .NET классы? Я знаю, что FD написан на .NET, но при чем тут флэш-сокеты?

Может быть там у wvxvw ролик запускается не в standalone плеере, а во вкладке FlashDevelop, а для общения с роликом FD использует какую-нибудь C# оболочку над ActiveX компонентом, из которой ошибки и лезут. Это предположения )).

wvxvw 09.06.2008 01:31

alexcon314:
badun:
аха, так и есть =) ток в данном случае, как выяснилось, ошибка не из ФД, а трэйс-плугина к нему...

alexcon314 09.06.2008 01:40

А в стандалоне как все-таки?

wvxvw 09.06.2008 04:19

сейчас уже тяжело проверить... я точно не помню при каких обстоятельствах возникла ошибка... вполне возможно, что просто не дождался полного рестарта сервера и попробовал запустить его еще раз... или (было открыто несколько окон с той же флешкой, из флеш ИДЕ, експлорера и ФД) ФД закрылся с ошибкой (впервые %), а окно с сообщением висело на фоне под каким-то другим окном, и я просто не заметил... вариантов много...

ЗЫ. сам плугин дико глючный, и, возможно ошибка возникла гораздо раньше, просто пока он сообразил, что с ней что-то нужно делать, ситуация изменилась =)


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

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