Сведения о вопросе

nikolya

08:54, 11th August, 2020

Теги

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

Просмотров: 368   Ответов: 6

Нужно с 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), но не выводятся на экран. Сам же ПХП-скрипт подвисает после отправки (ждет ответа, но не получает его). Что я сделал не так?



  Сведения об ответе

FAriza

11:44, 18th August, 2020

Не факт, что данные приходят, ведь if(blockSize == 0) говорит, что если в переменной ноль, то он выведет строчку, так что утвержадть, что данные пришли по этим соображениям — неверно. Нужно юзать отладку, так сразу и не скажешь. В переменной также может храниться «мусор», нужно юзать malloc для обнуления памяти. Это что касалось C++

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

Я вообще в программировании не силен, но может это хоть как-то поможет.


  Сведения об ответе

P_S_S

07:52, 2nd August, 2020

Если все запускается под линуксом то можно с помощью strace запустить и скрипт и qt приложение, и посмотреть как там системные вызовы идут.


  Сведения об ответе

SILA

21:04, 22nd August, 2020

Я подозреваю, что надо писать в сокет данные в том же формате в каком QT сериализует строки.
Там как минимум должны присутствовать или признак конца строки или ее длинна.

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


  Сведения об ответе

SEEYOU

11:13, 6th August, 2020

Конечно аналогичный. Потому что для этого

QString message; in >> message;

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


  Сведения об ответе

#hash

09:18, 16th August, 2020

Так тоже самое:



<?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.


  Сведения об ответе

PHPH

03:18, 15th August, 2020

Оказалось, я перепутал 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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться