crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Сервер, чтение сокета
Zizilk
  опции профиля:
сообщение 28.7.2010, 22:27
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 33
Регистрация: 26.7.2010
Пользователь №: 1902

Спасибо сказали: 0 раз(а)




Репутация:   0  


Имеется сервер.
Он должен получать данные от клиента написанного на PHP.
На сервере есть массив декрипторов подключённых сокетов.

Собственно вопрос...
Как организовать так, чтобы сервер пробегался по старым декрипторам из массива, получал данные, и в зависимости от них уже работал.
Я так понимаю делается это через бесконечный цикл, который управляется из паралельного потока?

Смотрел пример клиента но там больше подойдёт именно для клиентской части, где будет один сокет.


И ещё вопрос, как организовать чтение из сокета?
Если допустим с клиента на PHP передаются целые(пока) и дальше строковые значения?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 29.7.2010, 18:24
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2933
Регистрация: 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)

пока код такой

printf("Reciving\n");
QTcpSocket*  ClientSocket=(QTcpSocket*)sender();
QDataStream in(ClientSocket);
Char* str;
printf("Recived %s",str);


Перепечатывал с нетбука) он щас не подключён к инетупоэтому мог опечататься).


Там ещё проверка есть на целостность даных, но пока её закоментил)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.7.2010, 18:45
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2933
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Ну, тут всё просто
Char* str;//неинициализированная переменная...
printf("Recived %s",str);//...используется
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Zizilk
  опции профиля:
сообщение 30.7.2010, 19:03
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 33
Регистрация: 26.7.2010
Пользователь №: 1902

Спасибо сказали: 0 раз(а)




Репутация:   0  


опечатался) пропустил строчку

printf("Reciving\n");
QTcpSocket*  ClientSocket=(QTcpSocket*)sender();
QDataStream in(ClientSocket);
Char* str;
in>>str;
printf("Recived %s",str);


Вот так вот выглядит код...
и всё равно 0
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.7.2010, 19:27
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2933
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Zizilk, а ты уверен, что оператор ">>" выделяет из кучи память под строку, присваивает адрес указателю и заполняет всю эту радость из in ?

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Zizilk
  опции профиля:
сообщение 30.7.2010, 19:43
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 33
Регистрация: 26.7.2010
Пользователь №: 1902

Спасибо сказали: 0 раз(а)




Репутация:   0  


Честно нет :blush2:
Я ещё не дошёл в книжке по С которую читаю до указателей, и плохо представляю ка они работают):blush2:
Те так должно выглядеть?)
printf("Reciving\n");
QTcpSocket*  ClientSocket=(QTcpSocket*)sender();
QDataStream in(ClientSocket);
Char str;
Char* str;
in>>str;
printf("Recived %s",str);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.7.2010, 19:59
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2933
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Указатели - это переменные, которые хранят адрес оперативной памяти

Ты объявил указатель str , но не инициализировал ничем, там сейчас "мусор", то есть адрес невалидный. Вообще, возьми за правило инициализировать указатель нулём, если сразу нечем больше инициализировать

Char* str=0;

Когда указатель равен нулю, в дебаге легко поймать некорректное использование указателя.

Для класса QDataStream есть оператор
QDataStream & QDataStream::operator>> ( char *& s )
This is an overloaded function.
Reads the '\0'-terminated string s from the stream and returns a reference to the stream.
Space for the string is allocated using new -- the caller must destroy it with delete[].

Он принимает ссылку на указатель на char. То есть, судя по описанию, там действительно выделяется память из кучи, и ещё тебе надо потом удалить память обратно в кучу не забыть.
in>>str;
printf("Recived %s",str);
delete [] str;
str=0;

То есть, ты всё правильно вызвал то.

Значит, дело в содержимом 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


фрилансер
******

Группа: Участник
Сообщений: 2933
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Тут дело больше в том, что байты то ты можешь обрабатывать как хочешь, но для перевода в строковый вид тебе их надо сначала... перевести в строковый вид ))

например, массив содержит
unsigned char arr[]={0x00,0x00,0x11,0x22,0x33,0x44};


после форматирования в строку, содержимое последней должно быть, наприсер, таким

char* str="00 00 11 22 33 44";
//в байтовом представлении это
//unsigned char arr[]={0x30,0x30,0x20,  0x30,0x30,0x20,  0x31,0x31,0x20,
//        0x32,0x32,0x20,  0x33,0x33,0x20,  0x34,0x34,0x00};

ощущаешь разницу?

Сообщение отредактировал Алексей1153 - 30.7.2010, 21:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2022, 7:26