Сервер, чтение сокета |
Здравствуйте, гость ( Вход | Регистрация )
Сервер, чтение сокета |
Zizilk |
28.7.2010, 22:27
Сообщение
#1
|
Студент Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: 0 |
Имеется сервер.
Он должен получать данные от клиента написанного на PHP. На сервере есть массив декрипторов подключённых сокетов. Собственно вопрос... Как организовать так, чтобы сервер пробегался по старым декрипторам из массива, получал данные, и в зависимости от них уже работал. Я так понимаю делается это через бесконечный цикл, который управляется из паралельного потока? Смотрел пример клиента но там больше подойдёт именно для клиентской части, где будет один сокет. И ещё вопрос, как организовать чтение из сокета? Если допустим с клиента на PHP передаются целые(пока) и дальше строковые значения? |
|
|
Алексей1153 |
29.7.2010, 18:24
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Обычно класс <какого-нибудь>сокета умеет себя извещать о пришедших данных (вернее, это делает система)
|
|
|
Zizilk |
30.7.2010, 17:38
Сообщение
#3
|
Студент Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: 0 |
да я уже нашёл такую возможность у QT через чигнал "readytoread"
Но возник другой вопрос... Есть PHP клиент и сервер на QT С++. Связываются отлично. Сервер отсылает клиенту пока тестовую строчку, клиент получает. А вот с обратной связью не получается. Клиент рапортует об удачной отправке. На сервере запускается функция, говорящая о новых данных в сокете. Но получает (null) пока код такой
Перепечатывал с нетбука) он щас не подключён к инетупоэтому мог опечататься). Там ещё проверка есть на целостность даных, но пока её закоментил) |
|
|
Алексей1153 |
30.7.2010, 18:45
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Ну, тут всё просто
|
|
|
Zizilk |
30.7.2010, 19:03
Сообщение
#5
|
Студент Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: 0 |
опечатался) пропустил строчку
Вот так вот выглядит код... и всё равно 0 |
|
|
Алексей1153 |
30.7.2010, 19:27
Сообщение
#6
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Zizilk, а ты уверен, что оператор ">>" выделяет из кучи память под строку, присваивает адрес указателю и заполняет всю эту радость из in ?
|
|
|
Zizilk |
30.7.2010, 19:43
Сообщение
#7
|
Студент Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: 0 |
Честно нет
Я ещё не дошёл в книжке по С которую читаю до указателей, и плохо представляю ка они работают) Те так должно выглядеть?)
|
|
|
Алексей1153 |
30.7.2010, 19:59
Сообщение
#8
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Указатели - это переменные, которые хранят адрес оперативной памяти
Ты объявил указатель str , но не инициализировал ничем, там сейчас "мусор", то есть адрес невалидный. Вообще, возьми за правило инициализировать указатель нулём, если сразу нечем больше инициализировать Char* str=0; Когда указатель равен нулю, в дебаге легко поймать некорректное использование указателя. Для класса QDataStream есть оператор
Он принимает ссылку на указатель на char. То есть, судя по описанию, там действительно выделяется память из кучи, и ещё тебе надо потом удалить память обратно в кучу не забыть.
То есть, ты всё правильно вызвал то. Значит, дело в содержимом in - копай ) Например, первый байт в потоке - 0x00, тогда строка будет выглядеть для printf пустой Сообщение отредактировал Алексей1153 - 30.7.2010, 20:04 |
|
|
Zizilk |
30.7.2010, 21:03
Сообщение
#9
|
Студент Группа: Участник Сообщений: 33 Регистрация: 26.7.2010 Пользователь №: 1902 Спасибо сказали: 0 раз(а) Репутация: 0 |
А как начать писать со следующего байта?)
Затык скорее всего именно в выводе, ща проверил количество байт в сокете когда приходит сообщение байт столько же сколько и ушло. хотя наверно перед строчкой, перед тем как выводить добавлю что-нить, чтоб было не нулевым |
|
|
Алексей1153 |
30.7.2010, 21:23
Сообщение
#10
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Тут дело больше в том, что байты то ты можешь обрабатывать как хочешь, но для перевода в строковый вид тебе их надо сначала... перевести в строковый вид ))
например, массив содержит
после форматирования в строку, содержимое последней должно быть, наприсер, таким
ощущаешь разницу? Сообщение отредактировал Алексей1153 - 30.7.2010, 21:26 |
|
|
Текстовая версия | Сейчас: 29.11.2024, 1:54 |