![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Zizilk |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Имеется сервер.
Он должен получать данные от клиента написанного на PHP. На сервере есть массив декрипторов подключённых сокетов. Собственно вопрос... Как организовать так, чтобы сервер пробегался по старым декрипторам из массива, получал данные, и в зависимости от них уже работал. Я так понимаю делается это через бесконечный цикл, который управляется из паралельного потока? Смотрел пример клиента но там больше подойдёт именно для клиентской части, где будет один сокет. И ещё вопрос, как организовать чтение из сокета? Если допустим с клиента на PHP передаются целые(пока) и дальше строковые значения? |
|
|
Алексей1153 |
![]()
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Обычно класс <какого-нибудь>сокета умеет себя извещать о пришедших данных (вернее, это делает система)
|
|
|
Zizilk |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
да я уже нашёл такую возможность у QT через чигнал "readytoread"
Но возник другой вопрос... Есть PHP клиент и сервер на QT С++. Связываются отлично. Сервер отсылает клиенту пока тестовую строчку, клиент получает. А вот с обратной связью не получается. Клиент рапортует об удачной отправке. На сервере запускается функция, говорящая о новых данных в сокете. Но получает (null) пока код такой
Перепечатывал с нетбука) он щас не подключён к инетупоэтому мог опечататься). Там ещё проверка есть на целостность даных, но пока её закоментил) |
|
|
Алексей1153 |
![]()
Сообщение
#4
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Ну, тут всё просто
|
|
|
Zizilk |
![]()
Сообщение
#5
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
опечатался) пропустил строчку
Вот так вот выглядит код... и всё равно 0 |
|
|
Алексей1153 |
![]()
Сообщение
#6
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Zizilk, а ты уверен, что оператор ">>" выделяет из кучи память под строку, присваивает адрес указателю и заполняет всю эту радость из in ?
|
|
|
Zizilk |
![]()
Сообщение
#7
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Честно нет
![]() Я ещё не дошёл в книжке по С которую читаю до указателей, и плохо представляю ка они работают) ![]() Те так должно выглядеть?)
|
|
|
Алексей1153 |
![]()
Сообщение
#8
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Указатели - это переменные, которые хранят адрес оперативной памяти
Ты объявил указатель str , но не инициализировал ничем, там сейчас "мусор", то есть адрес невалидный. Вообще, возьми за правило инициализировать указатель нулём, если сразу нечем больше инициализировать Char* str=0; Когда указатель равен нулю, в дебаге легко поймать некорректное использование указателя. Для класса QDataStream есть оператор
Он принимает ссылку на указатель на char. То есть, судя по описанию, там действительно выделяется память из кучи, и ещё тебе надо потом удалить память обратно в кучу не забыть.
То есть, ты всё правильно вызвал то. Значит, дело в содержимом in - копай ) Например, первый байт в потоке - 0x00, тогда строка будет выглядеть для printf пустой Сообщение отредактировал Алексей1153 - 30.7.2010, 20:04 |
|
|
Zizilk |
![]()
Сообщение
#9
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
А как начать писать со следующего байта?)
Затык скорее всего именно в выводе, ща проверил количество байт в сокете когда приходит сообщение байт столько же сколько и ушло. хотя наверно перед строчкой, перед тем как выводить добавлю что-нить, чтоб было не нулевым |
|
|
Алексей1153 |
![]()
Сообщение
#10
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Тут дело больше в том, что байты то ты можешь обрабатывать как хочешь, но для перевода в строковый вид тебе их надо сначала... перевести в строковый вид ))
например, массив содержит
после форматирования в строку, содержимое последней должно быть, наприсер, таким
ощущаешь разницу? Сообщение отредактировал Алексей1153 - 30.7.2010, 21:26 |
|
|
Zizilk |
![]()
Сообщение
#11
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
чего-то совсем запутался(...
![]() Просто пересылаю из php клиента безобидную строчку "hi". И не пойму как добраться(. В примере который который есть поставляется вместе с креатором, там всё тоже самое, только из потока in заносится в QString и потом выводится в лейбл(там гуишное). А если так, то как-то сложно всё получается... Я явно, что-то делаю не так. Ps а как вывести Qstring переменную в консоль? |
|
|
Алексей1153 |
![]()
Сообщение
#12
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Zizilk |
![]()
Сообщение
#13
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Ничего не понятно. затык как раз с in, тк я пробовал выводить через дебаг Qstring всё равно нулевая строка
|
|
|
Алексей1153 |
![]()
Сообщение
#14
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
в доке:
попробуй так - получится ли ? |
|
|
Zizilk |
![]()
Сообщение
#15
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
по нулям
|
|
|
Алексей1153 |
![]()
Сообщение
#16
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Что значит по нулям )) Содержимое "str" и "a" после последней строчки чему равно ?
|
|
|
Zizilk |
![]()
Сообщение
#17
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
a не делал, только со стр(там код фактически такойже то к с функцией open)
содержимое str null |
|
|
Алексей1153 |
![]()
Сообщение
#18
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Ну не знаю, у меня всё чётко прочиталось - строка и 42.
|
|
|
Zizilk |
![]()
Сообщение
#19
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Я не знаю, может это изза того, что данные получаю из PHP, и там какой-то другой станадрт
( |
|
|
Алексей1153 |
![]()
Сообщение
#20
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Наверное, там юникод, тогда символ может состоять из нескольких байтов, а первым байтом может оказаться 0. А пытаешьсчя ты считать ASCIIz-строку. Вот и происходит так - пустая строка.
Как бороться - не знаю( |
|
|
Zizilk |
![]()
Сообщение
#21
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Исходник PHP в ansi кодировке, так что скорее всего отправляет тоже анси (лишнее подтверждение тому, что hi который отправляю весит 2 байта)
|
|
|
Zizilk |
![]()
Сообщение
#22
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Боюсь дело не в потоке, а в сокете...
При поптыки читать из сокета сервер крашится... нашёл ошибку, Я пытался в 1 байт засунуть 2+ байтов.... ![]() Как давно после PHP на C++ не программил. Поэтому там Qstring и использовали... |
|
|
Алексей1153 |
![]()
Сообщение
#23
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Zizilk |
![]()
Сообщение
#24
|
Студент ![]() Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
в Char который там использовал пытался запихнуть строку длиной больше 1-го байта
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 12.6.2025, 16:52 |