Russian Qt Forum

Qt => Работа с сетью => Тема начата: Luck от Ноябрь 21, 2009, 12:51



Название: Проверка успешной отправки данных через TCP/IP [Решено]
Отправлено: Luck от Ноябрь 21, 2009, 12:51
Я пишу TCP/IP сервер. Он отправляет QByteArray через сокет клиенту. Мне нужно проверить, успешно ли прошла отправка. Кто-нибудь подскажет, как это сделать?

Код:
    
    QByteArray sendP = forSend();
    QDataStream out(&sendP, QIODevice::WriteOnly);
    
    out << (quint16)0;
    out.device()->seek(0);
    out << (quint16)(sendP.size() - sizeof(quint16));
    
    m_ClientSocket->write(sendP); // это место должно проверяться


Название: Re: Проверка успешной отправки данных через TCP/IP
Отправлено: BRE от Ноябрь 21, 2009, 12:58
Я пишу TCP/IP сервер. Он отправляет QByteArray через сокет клиенту. Мне нужно проверить, успешно ли прошла отправка. Кто-нибудь подскажет, как это сделать?
Пусть клиент отправит подтверждение о том, что он успешно получил данные.


Название: Re: Проверка успешной отправки данных через TCP/IP
Отправлено: Luck от Ноябрь 21, 2009, 13:03
Нет, мне нужна именно проверка отправки.


Название: Re: Проверка успешной отправки данных через TCP/IP
Отправлено: BRE от Ноябрь 21, 2009, 13:05
Нет, мне нужна именно проверка отправки.
Так write тебе сообщает сколько байт он действительно записал в сокет или -1 если произошла ошибка.


Название: Re: Проверка успешной отправки данных через TCP/IP
Отправлено: Luck от Ноябрь 21, 2009, 13:12
Так write тебе сообщает сколько байт он действительно записал в сокет или -1 если произошла ошибка.

т.е. можно сделать так?
Код:
QByteArray sendP = forSend();
    QDataStream out(&sendP, QIODevice::WriteOnly);
   
    out << (quint16)0;
    out.device()->seek(0);
    out << (quint16)(sendP.size() - sizeof(quint16));
   
    if(!(m_ClientSocket->write(sendP)))
    {
          ... //Error
    }



Название: Re: Проверка успешной отправки данных через TCP/IP
Отправлено: BRE от Ноябрь 21, 2009, 13:15
Если write возвращает -1, то это означает ошибку и то что ни одного байта не записалось.
Если возвращает другое число, то это означает сколько байт реально записалось в сокет. Это значение может быть меньше того, которое ты хотел записать и означает, что остальные данные нужно записать позже.
В Qt запись в сокет буферизируется, т.е. сама библиотеке будет пытаться записать все данные. Проверяй на -1.
Почитай по-больше про сокеты.


Название: Re: Проверка успешной отправки данных через TCP/IP
Отправлено: Luck от Ноябрь 21, 2009, 13:16
спасибо