Название: В чем разница: QAbstractSocket::close() и QAbstractSocket::disconnectFromHost()? Отправлено: OS2 от Январь 14, 2011, 19:20 Никак не могу понять, в чем принципиальная разница между двумя этими методами. Когда следует вызывать QAbstractSocket::close(), а когда QAbstractSocket::disconnectFromHost()? ??? ??? ???
Знатоки, поделитесь опытом! Название: Re: В чем разница: QAbstractSocket::close() и QAbstractSocket::disconnectFromHost()? Отправлено: Akon от Январь 15, 2011, 21:03 Если не ошибаюсь,
QIODevice::close(), QAbstractSocket не изменяет его. disconnectToHost это корректное (graceful) завершение TCP соединения. Название: Re: В чем разница: QAbstractSocket::close() и QAbstractSocket::disconnectFromHost()? Отправлено: JamS007 от Январь 15, 2011, 22:10 Не знаю насколько мое предположение верно, но все же:
close() - закрыть соединения на хосте, принудительно отключить клиента. disconnectFromHost() - закрыть соединение на клиенте, отключившись от хоста. Название: Re: В чем разница: QAbstractSocket::close() и QAbstractSocket::disconnectFromHost()? Отправлено: OS2 от Январь 15, 2011, 23:33 Предположим, на клиентской стороне мне нужно завершить работу клиента и отключиться от сервера, с последующем удалением объекта QAbstractSocket, что мне следует вызвать перед удалением QAbstractSocket: close() или disconnectFromHost()?
Или например, в случае если я хочу временно разорвать соединение с сервером, не удаляя объект класса QAbstractSocket, что следует вызвать? Название: Re: В чем разница: QAbstractSocket::close() и QAbstractSocket::disconnectFromHost()? Отправлено: JamS007 от Январь 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". Название: Re: В чем разница: QAbstractSocket::close() и QAbstractSocket::disconnectFromHost()? Отправлено: Akon от Январь 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(), то еще не отправленные данные (находящиеся в системном буфере) будут потеряны. Название: Re: В чем разница: QAbstractSocket::close() и QAbstractSocket::disconnectFromHost()? Отправлено: OS2 от Январь 17, 2011, 01:30 Значит QAbstractSocket::close() фактически тоже самое, что и: QAbstractSocket::disconnectFromHost(), за исключением того, что последний попытается передать еще не отправленные данные на сервер?
ЗЫ: Цитировать Если тупо использовать QAbstractSocket::close(), то еще не отправленные данные (находящиеся в системном буфере) будут потеряны. А если перед вызовом QAbstractSocket::close() сделать flush()?Название: Re: В чем разница: QAbstractSocket::close() и QAbstractSocket::disconnectFromHost()? Отправлено: Akon от Январь 17, 2011, 18:21 Проясни для себя (хотя бы в общих чертах) как работает TCP/IP. Почитай, для чего нужен flush (очень подробно написано).
|