Russian Qt Forum
Апрель 20, 2024, 02:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: TcpClient Read/Write  (Прочитано 4417 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« : Август 06, 2017, 12:02 »

Скажите приемлемо ли написаны функции:
запись запроса(writeReq) и чтения ответа(readAnswer(char *data, int size))
Код
C++ (Qt)
TcpClient::writeReq(char *data, int size)
{
len = size;
while(len){
int cnt = socket->write(data,len); //пишем, cnt - количество записсаных байт
data += cnt; //передвигаем указатель на cnt   l
               len -= cnt;        //уменьшаем длину на cnt
}
}
 
TcpClient::readAnswer(char *data, int size)
{
len = size;
while(len){
int cnt = socket->read(data,len); //читаем, cnt - количество считанных байт
data += cnt; //передвигаем указатель на cnt
len -= cnt;       //уменьшаем длину на cnt
}
}
 
 
 
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #1 : Август 06, 2017, 13:34 »

Код:
    length = QTcpSocket::write(buf, length);

Код:
    timeoutRead = (async)? 500 : 10000;

    while(QTcpSocket::bytesAvailable() < length){
        if(!QTcpSocket::waitForReadyRead(timeoutRead)){
            return _ERROR;
        }
    }

    length = QTcpSocket::read(buf, length);
    return length;
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #2 : Август 06, 2017, 21:03 »

Код:
    length = QTcpSocket::write(buf, length);

Код:
    timeoutRead = (async)? 500 : 10000;

    while(QTcpSocket::bytesAvailable() < length){
        if(!QTcpSocket::waitForReadyRead(timeoutRead)){
            return _ERROR;
        }
    }

    length = QTcpSocket::read(buf, length);
    return length;

Код:
    length = QTcpSocket::write(buf, length);
Здесь вы хотите сказать, что в любом случае весь буфер запишется.


Код:
    timeoutRead = (async)? 500 : 10000;

    while(QTcpSocket::bytesAvailable() < length){
        if(!QTcpSocket::waitForReadyRead(timeoutRead)){
            return _ERROR;
        }
    }

    length = QTcpSocket::read(buf, length);
    return length;
2.А здесь мы будем ожидать до тех пор пока в буфере драйвера не накопится нужное количество
байт и затем считаем.

Я правильно Вас понял?
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #3 : Август 06, 2017, 21:54 »

Здесь вы хотите сказать, что в любом случае весь буфер запишется.
Да, но может, не сразу - сокет буферизуется. Если не ошибаюсь, вы можете добавить вызов waitForBytesWritten, чтобы убедиться, что данные ушли.
2.А здесь мы будем ожидать до тех пор пока в буфере драйвера не накопится нужное количество
байт и затем считаем.
Да.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #4 : Август 06, 2017, 22:48 »

Здесь вы хотите сказать, что в любом случае весь буфер запишется.
Да, но может, не сразу - сокет буферизуется. Если не ошибаюсь, вы можете добавить вызов waitForBytesWritten, чтобы убедиться, что данные ушли.
2.А здесь мы будем ожидать до тех пор пока в буфере драйвера не накопится нужное количество
байт и затем считаем.
Да.

Тогда вопрос.
А что у меня было изначально некорректно? Строит глазки
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #5 : Август 07, 2017, 09:06 »

А что у меня было изначально некорректно? Строит глазки

лишние телодвижения по записи в сокет и неполные проверки кода возврата если уж хочется так делать
waitForBytesWritten не написано что гарантирует уход данных в канал, но только в сокет и смысл её использовать нет

при чтении также не нужно ждать в цикле - есть же события, по приходу данных
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #6 : Август 07, 2017, 09:07 »

А что у меня было изначально некорректно? Строит глазки

лишние телодвижения по записи в сокет и неполные проверки кода возврата если уж хочется так делать
waitForBytesWritten не написано что гарантирует уход данных в канал, но только в сокет и смысл её использовать нет

при чтении также не нужно ждать в цикле - есть же события, по приходу данных


Логично. Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.075 секунд. Запросов: 22.