crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QTcpSocket. Как понять, что данные досттавлены?
MishaUA
  опции профиля:
сообщение 12.1.2015, 4:29
Сообщение #1


Участник
**

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

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




Репутация:   0  


QTcpSocket подключается к серверу, после чего начинает обмениваться с ним данными. Интересует, можно ли как-то узнать, доставлены ли данные после вызова метода write? Есть сигнал bytesWritten, но он вызывается, после вызова write() даже когда данные не доставлены. Так же, есть сигнал readyRead, сервер после получения данных должен присылать ответ, можно после write поднимать флаг, а при вызове readyRead его сбрасывать, если сброс не произошел по таймауту, то переподключаться и отправлять этот пакет заново. Но насколько знаю, TCP позволяет контролировать доставку данных, или я ошибаюсь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 12.1.2015, 5:47
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


Вообще протокол TCP должен гарантировать 100%-ю доставку данных и о таких проблемах я не слышал.
Теоретически может срабатывать алгоритм Нейгла:
Цитата
...Алгоритм Нейгла работает путем объединения нескольких небольших исходящих сообщений, а затем отправки их всех сразу. В частности, пока существует отправленный пакет, для которого отправитель еще не получил никакого подтверждения о доставке, отправитель должен держать в буфере его данные для отправки, до тех пор, пока не наберется достаточно данных на полный пакет, который можно отправить единожды...
Читать на википедии

Если коротко, то он маленькие пакеты сразу не отправляет, а ждет пока накопится определенный объем или не наступит таймаут.
Отключить это на Qt:
socket->setSocketOption(QAbstractSocket::LowDelayOption, true)
(надо сделать на обоих концах).

Но и простой отчет о доставке реализовать просто (но протокол TCP делает это внутри себя)

Сообщение отредактировал mezmay - 12.1.2015, 13:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 12.1.2015, 20:58
Сообщение #3


Участник
**

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

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




Репутация:   0  


Спасибо за ответ!
Но всё же, не понятно, как можно узнать о том, что данные дошли? Даже если отключил этот алгоритм, то сигнал bytesWritten вызывается сразу же после вызова метода write(), даже если данные не дошли.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.10.2019, 22:19