![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Mar 2013
Сообщений: 5
|
Привет всем! Сижу уже целый день на одном месте, пишу в 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);
Ошибка, которую выдает флеш имеет такой вид: и т.д. |
|
|||||
|
Регистрация: 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-битный? По-хорошему, нужно либо сразу работать с байтами, либо кодировать/декодировать текстовую строку в правильный байтовый буфер. |
|
|||||
|
[+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);
Удачи!
__________________
Небольшая часть реализации моего внутреннего мира |
|
|||||
|
Регистрация: 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");
}
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>" Что еще можно попытаться сделать? Последний раз редактировалось Casperovskii; 03.03.2013 в 12:58. Причина: Поправил пунктуацию |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Так... С кодировками стало гораздо лучше. Только вот вы зачем-то к буферу прибавляете пустую строку. Это нехорошо. Это ничего не даст. Прибавляйте к ней char, тогда он добавится. Или, лучше, append'ите char в этот буфер, а не прибавляйте. Должно помочь.
|
|
|||||
|
Регистрация: Mar 2013
Сообщений: 5
|
Не помогло. Или я неправильный нулевой байт добавляю?
|
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Неправильно. Вы опять добавляете строку (char *, пустую), а я прошу добавить символ (char). Ладно, подскажу. Символ записывается '\0'.
|
|
|||||
|
Регистрация: Mar 2013
Сообщений: 5
|
Именно оно! Да! Все заработало. Окончательный код сервера:
Огромное спасибо! Вдохнул в меня жизнь просто. |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:56. |
|
|
« Предыдущая тема | Следующая тема » |
|
|