Russian Qt Forum

Qt => Работа с сетью => Тема начата: demaker от Август 06, 2017, 12:02



Название: TcpClient Read/Write
Отправлено: demaker от Август 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
}
}
 
 
 


Название: Re: TcpClient Read/Write
Отправлено: sergek от Август 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;


Название: Re: TcpClient Read/Write
Отправлено: demaker от Август 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.А здесь мы будем ожидать до тех пор пока в буфере драйвера не накопится нужное количество
байт и затем считаем.

Я правильно Вас понял?


Название: Re: TcpClient Read/Write
Отправлено: sergek от Август 06, 2017, 21:54
Здесь вы хотите сказать, что в любом случае весь буфер запишется.
Да, но может, не сразу - сокет буферизуется. Если не ошибаюсь, вы можете добавить вызов waitForBytesWritten, чтобы убедиться, что данные ушли.
2.А здесь мы будем ожидать до тех пор пока в буфере драйвера не накопится нужное количество
байт и затем считаем.
Да.


Название: Re: TcpClient Read/Write
Отправлено: demaker от Август 06, 2017, 22:48
Здесь вы хотите сказать, что в любом случае весь буфер запишется.
Да, но может, не сразу - сокет буферизуется. Если не ошибаюсь, вы можете добавить вызов waitForBytesWritten, чтобы убедиться, что данные ушли.
2.А здесь мы будем ожидать до тех пор пока в буфере драйвера не накопится нужное количество
байт и затем считаем.
Да.

Тогда вопрос.
А что у меня было изначально некорректно? ::)


Название: Re: TcpClient Read/Write
Отправлено: qate от Август 07, 2017, 09:06
А что у меня было изначально некорректно? ::)

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

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


Название: Re: TcpClient Read/Write
Отправлено: demaker от Август 07, 2017, 09:07
А что у меня было изначально некорректно? ::)

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

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


Логично. Спасибо.