Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Сервер на С++, клиент на Flash. Файл политики (http://www.flasher.ru/forum/showthread.php?t=195188)

Casperovskii 01.03.2013 22:31

Сервер на С++, клиент на 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: Нарушение изолированной среды:

и т.д.

maxkar 02.03.2013 01:09

Вижу точно одну ошибку и одну потенциальную ошибку.

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

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

ZicoRio 02.03.2013 23:38

Если используете Qt 5 - откатывайтесь скорей на Qt 4.8.4.
В пятерке пока многова-то ошибок.
И для перевода всего в UTF-8:
Код:

QTextCodec *utfcodec=QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(utfcodec);
QTextCodec::setCodecForCStrings(utfcodec);

Как разберетесь - отпишитесь.
Удачи!

Casperovskii 03.03.2013 12:58

Да, верно, программирую в 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.
Что еще можно попытаться сделать?

maxkar 03.03.2013 14:35

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

Casperovskii 03.03.2013 16:46

Код:

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);
    }

Не помогло. Или я неправильный нулевой байт добавляю?

maxkar 03.03.2013 17:27

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

KumoKairo 03.03.2013 19:15

Не забудьте отключить IPv6 на сервере.

Casperovskii 03.03.2013 20:51

Цитата:

Сообщение от maxkar (Сообщение 1123337)
Символ записывается '\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);
    }

Огромное спасибо! Вдохнул в меня жизнь просто.

iflamberg 03.03.2013 20:57

Вот странно, кстати, у меня вот так работает:
Код:

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, время: 04:20.

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