Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.06.2008, 18:56
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 1  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
По умолчанию Нужна помощь в настройке 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!"); ничего не посылает либо ПХП ничего не возвращает =/ Самое удивительное то, что ПХП в любом случае лог не пишет (но если просто обратиться к нему из браузера, то лог будет создан)
Через браузер - секьюрити еррор...
__________________
Hell is the possibility of sanity

Старый 07.06.2008, 21:32
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Через xmlsocket:// указывается только хост, а не имя файла.

Старый 08.06.2008, 00:18
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 3  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Хм... ок, оказалось, что как раз 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
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 08.06.2008 в 00:21.
Старый 08.06.2008, 00:33
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 4  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
А, можно поподробнее, что должно получится, когда ето все будет работать?
Сокеты служат для передачи данных по сети. С их помощью можно общаться с портами удаленного сервера. Работа с сокетами подобна работе с файлами в РНР.

А это что за фича
Код:
$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

Старый 08.06.2008, 01:58
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Это не фишка... просто в файл пишется лог о том, что смог/не смог сделать скрипт...
И этот скрипт никогда не будет доступен по сети, только локально, это его предназначение... т.е. флешка используется для того, чтобы рендерить картинки и посылать их "по почте" на сохранение.
Т.е. в итоге, что мне нужно сделать:
шаг 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>
Название: socket_error.gif
Просмотров: 1914

Размер: 9.3 Кб

В итоге доработался до такого... вопрос, как у меня могло это получиться, если сокет всего 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, как указано в доках... =(
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 08.06.2008 в 04:59.
Старый 08.06.2008, 13:58
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Должен быть запущен сокет-сервер, а не http-сервер на 843-ем порту.

Старый 08.06.2008, 14:10
Сайлас вне форума Посмотреть профиль Отправить личное сообщение для Сайлас Найти все сообщения от Сайлас
  № 7  
Ответить с цитированием
Сайлас

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

Старый 08.06.2008, 16:25
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 8  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Цитата:
Сообщение от __etc Посмотреть сообщение
Должен быть запущен сокет-сервер, а не http-сервер на 843-ем порту.
угу... осознание этого пришло только на вторые сутки %)

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

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

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


Последний раз редактировалось wvxvw; 08.06.2008 в 16:52.
Старый 08.06.2008, 18:49
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 9  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
апач и есть сокет сервер слушает он 80й портю вообще ХТТП этот тоже сокет, просто он закрывается сразу после запроса. и запрос имеет специфичный вид.

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

Старый 08.06.2008, 19:23
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 10  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Цитата:
Сообщение от BlooDHounD Посмотреть сообщение
апач и есть сокет сервер слушает он 80й портю вообще ХТТП этот тоже сокет, просто он закрывается сразу после запроса. и запрос имеет специфичный вид.
Это понятно. Только в понимании большинства флешеров сокет-сервер суть не http-сервер, а кастомный. То, что технически и то и другое по одному принципу работает, не имеет никакого значения.

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:23.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
apache , crossdomain , security , socket
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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