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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: В чем разница: QAbstractSocket::close() и QAbstractSocket::disconnectFromHost()?  (Прочитано 6109 раз)
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« : Январь 14, 2011, 19:20 »

Никак не могу понять, в чем принципиальная разница между двумя этими методами. Когда следует вызывать  QAbstractSocket::close(), а когда QAbstractSocket::disconnectFromHost()?  Непонимающий  Непонимающий  Непонимающий
Знатоки, поделитесь опытом!
Записан
Akon
Гость
« Ответ #1 : Январь 15, 2011, 21:03 »

Если не ошибаюсь,
QIODevice::close(), QAbstractSocket не изменяет его.
disconnectToHost это корректное (graceful) завершение TCP соединения.
Записан
JamS007
Гость
« Ответ #2 : Январь 15, 2011, 22:10 »

Не знаю насколько мое предположение верно, но все же:

close() - закрыть соединения на хосте, принудительно отключить клиента.
disconnectFromHost() - закрыть соединение на клиенте, отключившись от хоста.
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #3 : Январь 15, 2011, 23:33 »

Предположим, на клиентской стороне мне нужно завершить работу клиента и отключиться от сервера, с последующем удалением объекта QAbstractSocket, что мне следует вызвать перед удалением QAbstractSocket: close() или disconnectFromHost()?
Или например, в случае если я хочу временно разорвать соединение с сервером, не удаляя объект класса QAbstractSocket, что следует вызвать?
Записан
JamS007
Гость
« Ответ #4 : Январь 15, 2011, 23:43 »

В справке написано вот что (вольный перевод):

void QAbstractSocket::close () [virtual]
Цитировать
Closes the I/O device for the socket, disconnects the socket's connection with the host, closes the socket, and resets the name, address, port number and underlying socket descriptor.

Останавливает устройство ввода/вывода сокета (скорее всего что-то на низком уровне), закрывает соединение с хостом, закрывает сокет, и восстанавливает параметры сокета (имя? адрес, порт, и дескриптор) в состояние по умолчанию.

void QAbstractSocket::disconnectFromHost ()
Цитировать
Attempts to close the socket. If there is pending data waiting to be written, QAbstractSocket will enter ClosingState and wait until all data has been written. Eventually, it will enter UnconnectedState and emit the disconnected() signal.

Пытается закрыть сокет (по видимому вызывая что-то эквивалентное close() ). Если есть ожидающие отправки данные  - сокет перейдет в состояние закрытия, и будет дожидаться отправки данных.  В результате сокет примет состояние "UnconnectedState" и пошлет сигнал "disconnected".
Записан
Akon
Гость
« Ответ #5 : Январь 16, 2011, 19:29 »

Цитировать
Если не ошибаюсь,
QIODevice::close(), QAbstractSocket не изменяет его.

Ошибся насчет QAbstractSocket::close - переопределяется относительно QIODevice.

Предположим, на клиентской стороне мне нужно завершить работу клиента и отключиться от сервера, с последующем удалением объекта QAbstractSocket, что мне следует вызвать перед удалением QAbstractSocket: close() или disconnectFromHost()?
Или например, в случае если я хочу временно разорвать соединение с сервером, не удаляя объект класса QAbstractSocket, что следует вызвать?

1. QAbstractSocket::disconnectFromHost() - еще не отправленные данные (находящиеся в системном буфере) будут отправляться, когда сервер примет все данные будет сигнал QAbstractSocket::disconnected(). 
2. Если нужно удалять объект QAbstractSocket - вызывать deleteLater() из обработчика QAbstractSocket::disconnected() (непосредственно в самом обработчике удалять нельзя - необходимо выполнять код, следующий за точкой выброса QAbstractSocket::disconnected()). Для отслеживания времени жизни сокета использовать QWeakPointer.

Если тупо использовать QAbstractSocket::close(), то еще не отправленные данные (находящиеся в системном буфере) будут потеряны.
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #6 : Январь 17, 2011, 01:30 »

Значит QAbstractSocket::close() фактически тоже самое, что и: QAbstractSocket::disconnectFromHost(), за исключением того, что последний попытается передать еще не отправленные данные на сервер?

ЗЫ:
Цитировать
Если тупо использовать QAbstractSocket::close(), то еще не отправленные данные (находящиеся в системном буфере) будут потеряны.
А если перед вызовом QAbstractSocket::close() сделать flush()?
« Последнее редактирование: Январь 17, 2011, 01:40 от OS2 » Записан
Akon
Гость
« Ответ #7 : Январь 17, 2011, 18:21 »

Проясни для себя (хотя бы в общих чертах) как работает TCP/IP. Почитай, для чего нужен flush (очень подробно написано).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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