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

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 01.03.2013, 22:31
Casperovskii вне форума Посмотреть профиль Отправить личное сообщение для Casperovskii Найти все сообщения от Casperovskii
  № 1  
Ответить с цитированием
Casperovskii

Регистрация: Mar 2013
Сообщений: 5
По умолчанию Сервер на С++, клиент на Flash. Файл политики

Привет всем! Сижу уже целый день на одном месте, пишу в QT свой код. Есть такая проблема, флеш коннектится по 843 порту, ему уходит строчка с файлом политики сокетов, но он (флеш) не воспринимает его. Перечитал здесь темы 3-4, но так и не осилил. Почитал статью на хабре, не помогло. В общем сейчас вы - моя последняя надежда.
Код на С++:
Код:
if (txt==QString("<policy-file-request/>")){
        const char *line="<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\"/></cross-domain-policy>\0";
        qDebug()<<line;
        socket->write(line);
На флеше просто коннект по 1234 порту. Сокет объявлен выше вот так:
Код:
socket = new QTcpSocket();
Ошибка, которую выдает флеш имеет такой вид:
Код AS3:
Error #2048: Нарушение изолированной среды:
и т.д.

Старый 02.03.2013, 01:09
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 2  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Вижу точно одну ошибку и одну потенциальную ошибку.

Точно ошибка в том, что вы нулевой байт не посылаете в конце сообщения. char * не может содержать нулевого байта по определению. Это байт-терминатор. Так что все, что работает с этим char * (без явного указания длины) не воспринимает ваш \0 как часть строки. Поставьте \0 в начале и наслаждайтесь debug(). Как правильно сделать - не скажу, не пишу на С++ и документацию лень искать. Наверное, где-то в ней должно быть написано, как отдельные байты посылать.

Потенциальная ошибка. char != byte. А вот flash-player, вероятно, ждет все в UTF-8 (не проверял, может быть, заголовок xml корректно понимает). В какой кодировке socket->write пишет? А вдруг там utf-16? Или этот write ожидает byte */void * (и пишет байты) а при этом у вас char 16-битный или даже 32-битный? По-хорошему, нужно либо сразу работать с байтами, либо кодировать/декодировать текстовую строку в правильный байтовый буфер.

Старый 02.03.2013, 23:38
ZicoRio вне форума Посмотреть профиль Отправить личное сообщение для ZicoRio Найти все сообщения от ZicoRio
  № 3  
Ответить с цитированием
ZicoRio
[+5 18.06.13]
[+1 20.07.13]

Регистрация: Apr 2012
Адрес: ifinterface.com
Сообщений: 158
Если используете Qt 5 - откатывайтесь скорей на Qt 4.8.4.
В пятерке пока многова-то ошибок.
И для перевода всего в UTF-8:
Код:
QTextCodec *utfcodec=QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(utfcodec);
QTextCodec::setCodecForCStrings(utfcodec);
Как разберетесь - отпишитесь.
Удачи!

Старый 03.03.2013, 12:58
Casperovskii вне форума Посмотреть профиль Отправить личное сообщение для Casperovskii Найти все сообщения от Casperovskii
  № 4  
Ответить с цитированием
Casperovskii

Регистрация: Mar 2013
Сообщений: 5
Да, верно, программирую в QT, только 4.8.
Сейчас попробовал сделать вот так:
Код:
if (txt==QString("<policy-file-request/>")){
        QByteArray line=QString("<cross-domain-policy> <allow-access-from domain=\"*\" to-ports=\"*\"/> </cross-domain-policy>").toUtf8();
        qDebug()<<line;
        socket->write(line+"\0");
    }
Сделал через qDebug вывод текущих действий и вот что получается:
Код:
843port
"<policy-file-request/>" 
"<cross-domain-policy> <allow-access-from domain="*" to-ports="*"/> </cross-domain-policy>" 
other port 
"<policy-file-request/>" 
"<cross-domain-policy> <allow-access-from domain="*" to-ports="*"/> </cross-domain-policy>"
Т.е. Flash так и не распознал в этой строке фаил политики. Строку преобразовал в объект QByteArray, и добавляю нулевой байт непосредственно во write.
Что еще можно попытаться сделать?


Последний раз редактировалось Casperovskii; 03.03.2013 в 12:58. Причина: Поправил пунктуацию
Старый 03.03.2013, 14:35
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 5  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Так... С кодировками стало гораздо лучше. Только вот вы зачем-то к буферу прибавляете пустую строку. Это нехорошо. Это ничего не даст. Прибавляйте к ней char, тогда он добавится. Или, лучше, append'ите char в этот буфер, а не прибавляйте. Должно помочь.

Старый 03.03.2013, 16:46
Casperovskii вне форума Посмотреть профиль Отправить личное сообщение для Casperovskii Найти все сообщения от Casperovskii
  № 6  
Ответить с цитированием
Casperovskii

Регистрация: Mar 2013
Сообщений: 5
Код:
if (txt==QString("<policy-file-request/>")){
        QByteArray line=QString("<cross-domain-policy> <allow-access-from domain=\"*\" to-ports=\"*\"/> </cross-domain-policy>").toUtf8();
        line.append("\0");
        qDebug()<<line;
        socket->write(line);
    }
Не помогло. Или я неправильный нулевой байт добавляю?

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

Регистрация: Nov 2010
Сообщений: 497
Неправильно. Вы опять добавляете строку (char *, пустую), а я прошу добавить символ (char). Ладно, подскажу. Символ записывается '\0'.

Старый 03.03.2013, 19:15
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 8  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Не забудьте отключить IPv6 на сервере.

Старый 03.03.2013, 20:51
Casperovskii вне форума Посмотреть профиль Отправить личное сообщение для Casperovskii Найти все сообщения от Casperovskii
  № 9  
Ответить с цитированием
Casperovskii

Регистрация: Mar 2013
Сообщений: 5
Цитата:
Сообщение от maxkar Посмотреть сообщение
Символ записывается '\0'.
Именно оно! Да! Все заработало. Окончательный код сервера:
Код:
if (txt==QString("<policy-file-request/>")){
        QByteArray line=QString("<cross-domain-policy> <allow-access-from domain=\"*\" to-ports=\"*\"/> </cross-domain-policy>").toUtf8();
        line.append('\0');
        qDebug()<<line;
        socket->write(line);
    }
Огромное спасибо! Вдохнул в меня жизнь просто.

Старый 03.03.2013, 20:57
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 10  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Вот странно, кстати, у меня вот так работает:
Код:
char* securityAnswer = 
	"<cross-domain-policy>" 
	"<allow-access-from domain=\"*\" to-ports=\"3425\" />" 
	"</cross-domain-policy>"; 

...

					send(c.sock, securityAnswer, strlen(securityAnswer), 0);
					close(c.sock);
без всяких '\0'.
__________________
мой пустой блог

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

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

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


 


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


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