Задать вопрос

Обмен данными между PHP и серверным приложением на С++ Qt4?

Нужно с PHP передать на серверное приложение данные по SSL, дождаться ответных данных и вывести их на экран.



Написал такой код на PHP:

<br>
<?php<br>
error_reporting(E_ALL);<br>
<br>
$fp = fsockopen("ssl://localhost", 6000);<br>
<br>
$send = "hello";<br>
<br>
fputs($fp, $send);<br>
$html = fread($fp, 1000000);<br>
fclose($fp);<br>
<br>
echo "<pre>".$html."</pre>";<br>
?><br>




И функция приема сообщения на QT4

<br>
void CConnThread::slotReadyRead()<br>
{<br>
    //Создать поток данных.<br>
    QDataStream in(sslSocket);<br>
    in.setVersion(QDataStream::Qt_4_4);<br>
<br>
    //Если пришла первая часть из посланной клиентом информации.<br>
    if(blockSize == 0)<br>
    {<br>
       cout << "data transfer from client" << endl;<br>
        //Если первая часть меньше того кол-ва информации что определяет размер всего сообщения...<br>
       if(sslSocket->bytesAvailable() < (int)sizeof(qint64)) return;<br>
<br>
       //Получить размер посылаемого клиентом сообщения.<br>
       in >> blockSize;<br>
    }<br>
<br>
    //Если последующие части вместе взятые меньше, чем определенное клиентом кол-во...<br>
    if(sslSocket->bytesAvailable() < blockSize) return;<br>
<br>
    //Обнулить параметр размера посылаемого клиентом сообщения.<br>
    blockSize = 0;<br>
<br>
    //Получить строку сетевого сообщения.<br>
    QString message; in >> message;<br>
<br>
    //Далее... творим ;)<br>
<br>
    cout << message.toAscii().data() << endl;<br>
<br>
    this->sendMessage("received!");<br>
}<br>
<br>
void CConnThread::sendMessage(QString message)<br>
{<br>
    QByteArray block;<br>
    QDataStream out(&block, QIODevice::WriteOnly);<br>
    out.setVersion(QDataStream::Qt_4_4);<br>
    out << (qint64)0;<br>
    out << message;<br>
    out.device()->seek(0);<br>
    out << (qint64)(block.size() - sizeof(qint64));<br>
    sslSocket->write(block);<br>
}<br>




Но вот проблема — данные приходят (о чем свидетельствует вывод строки data transfer from client), но не выводятся на экран. Сам же ПХП-скрипт подвисает после отправки (ждет ответа, но не получает его). Что я сделал не так?
  • Вопрос задан
  • 3286 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 6
butteff
@butteff
Раз в тысячу лет заправляю свитер в носки
Не факт, что данные приходят, ведь if(blockSize == 0) говорит, что если в переменной ноль, то он выведет строчку, так что утвержадть, что данные пришли по этим соображениям — неверно. Нужно юзать отладку, так сразу и не скажешь. В переменной также может храниться «мусор», нужно юзать malloc для обнуления памяти. Это что касалось C++

А вот в пхп коде где проверки открылся ли сокет, есть ли соединение?
Может порт, на который Вы подключаетесь закрыт. и Вы подключаетесь на 6000 порт, а их всего 3665 вроде для TCP.

Я вообще в программировании не силен, но может это хоть как-то поможет.
Ответ написан
@naim
Если все запускается под линуксом то можно с помощью strace запустить и скрипт и qt приложение, и посмотреть как там системные вызовы идут.
Ответ написан
Комментировать
@xdenser
Я подозреваю, что надо писать в сокет данные в том же формате в каком QT сериализует строки.
Там как минимум должны присутствовать или признак конца строки или ее длинна.

Потом не понятно зачем считывать размер сообщения из сокета, если его туда не писали?
Во всяком случае fputs не пишет в хендл ничего, кроме того, что ему дали.
Ответ написан
@xdenser
Конечно аналогичный. Потому что для этого

QString message; in >> message;

надо сначала записать в сокет правильную длину строки.
Ответ написан
@Robotex Автор вопроса
Так тоже самое:


<?php
include_once('doc.write.php');

error_reporting(E_ALL);

$fp = fsockopen("ssl://localhost", 6000);

$send = doc_write_create();
doc_write_ui8($send, 6);
doc_write_string($send, "hello");

fputs($fp, doc_write_content($send));
$html = fread($fp, 1000000);
fclose($fp);

echo "<pre>".$html."</pre>";
?>


На сервере:
INFORMATION: tcp-server is listen on address 0x9afe312 and port 6000
INFORMATION: incoming of new connection 8
INFORMATION: client was connected
connection encrypted
data transfer from client
вот тут должно вывестись hello.
Ответ написан
@Robotex Автор вопроса
Оказалось, я перепутал little endian и big endian. Теперь вывод выглядит так:

INFORMATION: tcp-server is listen on address 0x8e15312 and port 6000
INFORMATION: incoming of new connection 8
INFORMATION: client was connected
connection encrypted
data transfer from client

INFORMATION: client was disconnected
INFORMATION: thread client was destroyed

Но почему-то строка на сервере пустая (хотя размер считывается правильный). И в ПХП скрипте не выводится ответ.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы