Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6085
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Обмен данными между 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), но не выводятся на экран. Сам же ПХП-скрипт подвисает после отправки (ждет ответа, но не получает его). Что я сделал не так?
<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><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>
Не факт, что данные приходят, ведь if(blockSize == 0) говорит, что если в переменной ноль, то он выведет строчку, так что утвержадть, что данные пришли по этим соображениям — неверно. Нужно юзать отладку, так сразу и не скажешь. В переменной также может храниться «мусор», нужно юзать malloc для обнуления памяти. Это что касалось C++
А вот в пхп коде где проверки открылся ли сокет, есть ли соединение?
Может порт, на который Вы подключаетесь закрыт. и Вы подключаетесь на 6000 порт, а их всего 3665 вроде для TCP.
Я вообще в программировании не силен, но может это хоть как-то поможет.
Я подозреваю, что надо писать в сокет данные в том же формате в каком QT сериализует строки.
Там как минимум должны присутствовать или признак конца строки или ее длинна.
Потом не понятно зачем считывать размер сообщения из сокета, если его туда не писали?
Во всяком случае fputs не пишет в хендл ничего, кроме того, что ему дали.
Так тоже самое:
<?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.
<?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>";
?>
Оказалось, я перепутал 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
Но почему-то строка на сервере пустая (хотя размер считывается правильный). И в ПХП скрипте не выводится ответ.
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться