crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Получение текста через TCP сокет, Нахождение символа конца строкит ()
fsMark
  опции профиля:
сообщение 2.5.2008, 23:42
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 23.4.2008
Из: г. Киров
Пользователь №: 155

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




Репутация:   1  


Получаю данные QTcpServer`ом от удаленного telnet клиента, признак конца команды (насколько я понял из немногочисленной документатции) есть ничто иное как признак конца строки и перевод каретки (т.е. "\n\r").
Использую следующий код для получения команды целиком (она записывается в буфер)
    void myFtpServer::slotReadClient() 
        {
        QTcpSocket* pClientSocket = (QTcpSocket*)sender();
        QTextStream in(pClientSocket);  
        QString tmp;    
        tmp = "";
        in >> tmp;
        buffer = buffer + tmp;    
        if (buffer.indexOf("\n\r")!=(-1))
        {
        //здесь обработка команды
        buffer = "";
        };
        
        }

Такой код ничего хорошего не дает ((, возникает вопрос правильно ли я ищу признак конца строки и перевод каретки.. или может я неправ насчет того что передает telnet при нажатии enter`а? Кто сталкивался подскажите пожалуйста.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.5.2008, 0:00
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


могу, путать, но помоему в telnet'е UNIX'овый конец т.е. \n

но \n\r, тогда вроде тоже должно катить
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fsMark
  опции профиля:
сообщение 3.5.2008, 0:10
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 23.4.2008
Из: г. Киров
Пользователь №: 155

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




Репутация:   1  


посредствам indexOf("") не определяется не \n, не \n\r. Видимо надо както подругому искать конец строки..
P.S. Тестировал видовым телнетом.

Сообщение отредактировал fsMark - 3.5.2008, 0:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 3.5.2008, 11:28
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Вообще-то не "\n\r", а "\r\n". :)
Другими словами так:
if (buffer.indexOf("\n\r")!=-1)

Цитата(' date='3.5.2008, 1:10) *
посредствам indexOf("") не определяется не \n, не \n\r. Видимо надо както подругому искать конец строки..
P.S. Тестировал видовым телнетом.
А ты уверен, что у тебя сервер принимает данные?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fsMark
  опции профиля:
сообщение 3.5.2008, 12:22
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 23.4.2008
Из: г. Киров
Пользователь №: 155

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




Репутация:   1  


Уверен, все текстовые символы получаю нормально, немогу только определить конец строки. Могет QTextStream их както подругому себе представляет?
Цитата
Вообще-то не "\n\r", а "\r\n".
Другими словами так:

if (buffer.indexOf("\n\r")!=-1)


А у меня так и написанно..)) в смысле "\n\r". Проблема в том что он даже "\n" не находит... а он в любом варианте должен быть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 3.5.2008, 13:43
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Цитата(' date='3.5.2008, 13:22) *
А у меня так и написанно..)) в смысле "\n\r". Проблема в том что он даже "\n" не находит... а он в любом варианте должен быть.
Извини, уже который раз при копи-пасте на одни и те же грабли наступаю, копирую, но поправить забываю, должно быть так:
if (buffer.indexOf("\r\n")!=-1)


Цитата(' date='3.5.2008, 13:22) *
Могет QTextStream их както подругому себе представляет?
Скорее всего так оно и есть, попробуй читать не в QTextStream, а с помощью qint64 QIODevice::read ( char * data, qint64 maxSize ).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fsMark
  опции профиля:
сообщение 3.5.2008, 19:07
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 23.4.2008
Из: г. Киров
Пользователь №: 155

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




Репутация:   1  


Все получилось, сделал так:
    void myFtpServer::slotReadClient() 
        {
            QTcpSocket* pClientSocket = (QTcpSocket*)sender();
        
            QByteArray temp;
        
            temp = pClientSocket->read(255);
            buffer = buffer + temp;
        
            if  (buffer.indexOf("\r\n")!=(-1))
                {            
                    //Обработка команд
                    buffer = "";
                }
        
        }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 3.5.2008, 22:03
Сообщение #8


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Думаю стоит поработать над вариантом, что будет, если тебе прийдет пакет 1024 байт? Или 2048, или n байт?
Другими словами cчитывать то количество байт, которое пришло, а не то, под которое ты выделил память.

Читай до тех пор, пока функция read не вернет 0 байт, так как:
Цитата
0 is returned when no more data is available for reading.
Используй функцию read ( char * data, qint64 maxSize ). ;)

Сообщение отредактировал ViGOur - 3.5.2008, 22:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 20.4.2024, 15:23