![]() |
Главная · Все классы · Основные классы · Классы по группам · Модули · Функции | ![]() |
Класс QAbstractSocket предоставляет возможности, общие для сокетов всех типов. Далее...
#include <QAbstractSocket>
Унаследован от QIODevice.
От него наследуются QTcpSocket и QUdpSocket.
Замечание: Все функции в этом классе реентерабельны.
Класс QAbstractSocket предоставляет возможности, общие для сокетов всех типов.
Класс QAbstractSocket является базовым для классов QTcpSocket и QUdpSocket и содержит все возможности, общие для этих двух классов. Если вам требуется сокет, вы можете сделать одно из двух:
TCP (Transmission Control Protocol) представляет собой надежный, потокоориентированный, основывающийся на соединениях транспортный протокол. UDP (User Datagram Protocol) представляет собой ненадежный, датаграммный транспортный протокол без соединений. На практике это означает, что протокол TCP более приспособлен для непрерывной передачи данных, в то время как более "легкий" протокол UDP можно использовать там, где надежность менее важна.
API класса QAbstractSocket унифицирует большинство различий между этими протоколами. Например, хотя протокол UDP соединений не поддерживает, функция connectToHost() создает виртуальное соединение для UDP-сокетов, что дает возможность пользоваться объектом класса QAbstractSocket более или менее одинаковым образом вне зависимости от используемого протокола. Технически QAbstractSocket запоминает адрес и порт, переданные функции connectToHost(), а функции вроде read() и write() будут потом использовать эти значения.
В любой момент времени объект класса QAbstractSocket находится в некотором состоянии (его возвращает функция state()). Начальным состоянием является UnconnectedState. После вызова connectToHost(), сокет переходит в состояние HostLookupState. Если узел найден, объект QAbstractSocket переходит в состояние ConnectingState и посылает сигнал hostFound(). Когда соединение установлено, он переходит в состояние ConnectedState и посылает connected(). Если на любом из этих шагов происходит ошибка, посылается сигнал error(). Всякий раз, когда состояние изменяется, посылается сигнал stateChanged(). Для удобства имеется функция isValid(), которая возвращает true, если сокет готов для чтения и записи, но учтите, что прежде, чем чтение или запись можно будет производить, сокет должен находиться в состоянии ConnectedState.
Производите чтение или запись с помощью вызова read() или write() или используйте более удобные функции readLine() и readAll(). QAbstractSocket также наследует getChar(), putChar() и ungetChar() от QIODevice, который работает с отдельными байтами. Для каждой порции данных, которые были записаны в сокет, высылается сигнал bytesWritten().
Сигнал readyRead() испускается каждый раз, когда новая порция данных приходит. Тогда bytesAvailable() возвращает число байт, доступных для чтения. Обычно вы соединяетесь с сигналом readyRead() слотом и читаете все доступные данные. Если вы не хотите читать все данные за один раз, оставшееся всегда доступно позже, всё, что приходит потом присоединяется к накопленному в буфере чтения QAbstractSocket'а. Для ограничения буфера чтения, вызовите setReadBufferSize().
Для закрытия сокета, вызовите disconnectFromHost(). QAbstractSocket переходит в состояние QAbstractSocket::ClosingState, потом высылает closing(). После того, как все необходимые данные были записаны в сокет, QAbstractSocket закрывает соединение, устанавливает QAbstractSocket::ClosedState и высылает disconnected(). Если вы хотите отменить соединение немедленно с откатом всех переданных данных, используйте abort(). Если удалённый узел закрывает соединение, QAbstractSocket вышлет ошибку(QAbstractSocket::RemoteHostClosedError), в то время как состояние сокета будет ConnectedState, а потом будет выслан сигнал disconnected().
Порт и адрес соединённого узла доступны с помощью peerPort() и peerAddress(). peerName() возвращает имя узла, как оно определено connectToHost(). localPort() и localAddress() возвращают порт и адрес локального сокета.
QAbstractSocket обеспечивает набор функций, которые приостанавливают обращения к потоку, пока определённый сигнал не будет послан. Эти функции могут быть использованы для реализации блокируемых сокетов:
Покажем на примере:
int numRead = 0, numReadTotal = 0;
char buffer[50];
forever {
numRead = socket.read(buffer, 50);
// сделать что-то с массивом
numReadTotal += numRead;
if (numRead == 0 && !socket.waitForReadyRead())
break;
}
Если waitForReadyRead() возвращает false, соединение закрылось или произошла ошибка.
Программирование с блокируемыми сокетами радикально отличается от работы с обычными сокетами. Блокируемые сокеты не требуют зацикливания событий и обычно помогает писать более простой код. Однако в GUI приложении они могут быть использованы только с не-GUI потоками, чтобы избежать замораживания графического интерфейса. Смотрите примеры network/fortuneclient и network/blockingfortuneclient, где реализованы оба подхода.
QAbstractSocket может быть использован с операциями потоков QTextStream и QDataStream (operator<<() и operator>>()). Существует одна особенность, которую следует знать: вы должны убедиться, что достаточно доступных для чтения данных, чтобы использовать операцию operator>>().
Смотрите также QFtp, QHttp и QTcpServer.
Это перечисление описывает какие версии протокола на межсетевом уровне используются в Qt.
Константа | Значение | Описание |
---|---|---|
QAbstractSocket::IPv4Protocol | 0 | IPv4 |
QAbstractSocket::IPv6Protocol | 1 | IPv6 |
QAbstractSocket::UnknownNetworkLayerProtocol | -1 | Отличный от IPv4 и IPv6 |
Смотрите также QHostAddress::protocol().
Это перечисление описывает ошибки, которые случаются при работе с сокетами.
Константа | Значение | Описание |
---|---|---|
QAbstractSocket::ConnectionRefusedError | 0 | Соединение было разорвано другим узлом (или по тайм-ауту). |
QAbstractSocket::RemoteHostClosedError | 1 | Удалённый узел закрыл соединение. Помните, что сокет клиента (например, текущий сокет) будет закрыт после отправления удалённого уведомления. |
QAbstractSocket::HostNotFoundError | 2 | Адрес узла не найден. |
QAbstractSocket::SocketAccessError | 3 | Операция с сокетом была прервана, так как приложение не получило необходимых прав. |
QAbstractSocket::SocketResourceError | 4 | У текущей системы не хватило ресурсов (например, слишком много сокетов). |
QAbstractSocket::SocketTimeoutError | 5 | Время для операции с сокетом истекло. |
QAbstractSocket::DatagramTooLargeError | 6 | Дейтаграмма больше, чем установленное ограничение в операционной системе (которое может быть меньше, чем 8192 байт). |
QAbstractSocket::NetworkError | 7 | Произошла ошибка в сети (например, сетевой кабель был неожиданно отключён). |
QAbstractSocket::AddressInUseError | 8 | Адрес, определённый в QUdpSocket::bind(), уже используется и установлен в состояние эксклюзивного использования. |
QAbstractSocket::SocketAddressNotAvailableError | 9 | Адрес, определённый в QUdpSocket::bind(), не найден на узле. |
QAbstractSocket::UnsupportedSocketOperationError | 10 | Запрашиваемая операция с сокетом не поддерживается текущей операционной системой (например, отсутствует поддержка IPv6). |
QAbstractSocket::ProxyAuthenticationRequiredError | 12 | Сокет использует прокси, который запрашивает аутентификацию. |
QAbstractSocket::UnknownSocketError | -1 | Произошла неопределённая ошибка. |
Используется только в QAbstractSocketEngine, эта ошибка говорит только о том, что последняя операция не была завершена.
Смотрите также QAbstractSocket::error().
Это перечисление описывает различные состояния сокета.
Константа | Значение | Описание |
---|---|---|
QAbstractSocket::UnconnectedState | 0 | Сокет не соединён. |
QAbstractSocket::HostLookupState | 1 | Сокет выполняет поиск имени узла. |
QAbstractSocket::ConnectingState | 2 | Сокет начинает устанавливать соединение. |
QAbstractSocket::ConnectedState | 3 | Соединение установлено. |
QAbstractSocket::BoundState | 4 | Сокет связан с адресом и портом (для серверов). |
QAbstractSocket::ClosingState | 6 | Сокет готовится к закрытию (данные всё ещё ожидают записи). |
QAbstractSocket::ListeningState | 5 | Только для внутреннего использования. |
Смотрите также QAbstractSocket::state().
Это перечисление описывает протокол транспортного уровня.
Константа | Значение | Описание |
---|---|---|
QAbstractSocket::TcpSocket | 0 | TCP |
QAbstractSocket::UdpSocket | 1 | UDP |
QAbstractSocket::UnknownSocketType | -1 | Отличный от TCP и UDP |
Смотрите также QAbstractSocket::socketType().
Создаёт новый абстрактный сокет типа socketType. Аргумент parent передаётся конструктору QObject.
Смотрите также socketType(), QTcpSocket и QUdpSocket.
Уничтожает сокет.
Закрывает текущее соединение и перезагружает сокет. В отличие от disconnectFromHost(), эта функция немедленно закрывает сокет, очищает буфер записи.
Смотрите также disconnectFromHost() и close().
Возвращает число присланных байт, которые ждут прочтения.
Переопределено из QIODevice.
Смотрите также bytesToWrite() и read().
Возвращает число байт, которые ждут отправки. Байты будут отосланы, когда управление вернётся обратно, или при вызове flush().
Переопределено из QIODevice.
Смотрите также bytesAvailable() и flush().
Возвращает true, если строка данных может быть прочитана из сокета; в противном случает возвращает false.
Переопределено из QIODevice.
Смотрите также readLine().
Разрывает соединение сокета с узлом.
Переопределено из QIODevice.
Смотрите также abort().
Пытается создать соединение с узлом hostName по порту port.
Сокет открывается по переданному openMode и сначала переходит в HostLookupState, затем выполняет поиск hostName. Если поиск завершился успешно, посылается hostFound() и QAbstractSocket переходит в состояние ConnectingState. Затем он пытается соединиться по адресу, полученному в результате поиска. В итоге, если соединение установлено, QAbstractSocket переходит в состояние ConnectedState и посылает сигнал connected().
На любом шаге сокет может отправить сигнал об ошибке error().
hostName может быть как IP-адресом в виде строки (например, "43.195.83.32"), так и именем узла (например,"www.trolltech.com"). QAbstractSocket будет совершать поиск, только если это необходимо. port представляется в текущей степени байта.
Смотрите также state(), peerName(), peerAddress(), peerPort() и waitForConnected().
Это перегруженная функция, предоставленная для удобства.
Пытается создать соединение с address по порту port.
Содержит реализацию connectToHost().
Пытается создать соединение с узлом hostName по порту port. Сокет открывается в режиме openMode.
Эта функция была введена в Qt 4.1.
Этот сигнал испускается после того, как connectToHost() была вызвана и соединение было успешно установлено.
Смотрите также connectToHost() и disconnected().
Попытка закрыть сокет. Если есть данные для записи, QAbstractSocket перейдёт в состояние ClosingState и будет ждать, пока данные не будут переданы. В конце концов, он перейдёт в состояние UnconnectedState и пошлёт сигнал disconnected().
Смотрите также connectToHost().
Содержит реализацию disconnectFromHost().
Эта функция была введена в Qt 4.1.
Этот сигнал посылается, когда сокет разрывает соединение.
Смотрите также connectToHost(), disconnectFromHost() и abort().
Возвращает тип последней произошедшей ошибки.
Смотрите также state() и errorString().
Это перегруженная функция, предоставленная для удобства.
Этот сигнал посылается после того, как произошла ошибка. Параметр socketError описывает тип ошибки.
QAbstractSocket::SocketError не является зарегистрированным мета-типом, поэтому для очереди соединений вам необходимо зарегистрировать его с помощью Q_REGISTER_METATYPE.
Смотрите также error() и errorString().
Эта функция передаёт по основному сетевому сокету столько байт из внутреннего буфера записи, сколько это возможно без блокировки. Если данные были записаны, функция вернёт true; в противном случае возвращается false.
Вызывайте эту функцию, если вам необходимо немедленно отправить данные по QAbstractSocket. Число переданный байт будет зависеть от операционной системы. В большинстве случаев вызывать эту функцию нет необходимости, так как QAbstractSocket начинает отправку данных автоматически, как только к нему переходит управление. Если этого не происходит, лучше вызывайте waitForBytesWritten() вместо текущей функции.
Смотрите также write() и waitForBytesWritten().
Этот сигнал посылается после вызова connectToHost() и успешного завершения поиска.
Смотрите также connected().
Возвращает true, если сокет корректен и готов к использованию; в противном случае возвращает false.
Замечание: Состояние сокета должно быть ConnectedState до того, как будет произведено чтение или запись.
Смотрите также state().
Возвращает адрес узла локального сокета, если это возможно; если нет, возвращает QHostAddress::Null.
Как правило, это главный IP-адрес узла, но может являться и QHostAddress::LocalHost (127.0.0.1) для соединений локального узла.
Смотрите также localPort(), peerAddress() и setLocalAddress().
Возвращает порт узла (в родном байтовом виде) локального сокета, если он доступен; если нет, возвращается 0.
Смотрите также localAddress(), peerPort() и setLocalPort().
Возвращает адрес присоединённого узла, если сокет находится в состоянии ConnectedState; в противном случае возвращает QHostAddress::Null.
Смотрите также peerName(), peerPort(), localAddress() и setPeerAddress().
Возвращает имя присоединённого узла, определённого в connectToHost(), или пустую строку QString, если connectToHost() был закрыт.
Смотрите также peerAddress(), peerPort() и setPeerName().
Возвращает порт присоединённого узла, если сокет находится в ConnectedState; в противном случае возвращает 0.
Смотрите также peerAddress(), localPort() и setPeerPort().
Возвращает сетевой прокси для данного сокета. По умолчанию используется QNetworkProxy::DefaultProxy.
Эта функция была введена в Qt 4.1.
Смотрите также setProxy() и QNetworkProxy.
Этот сигнал посылается, когда используется прокси proxy, требующий аутентификации. Объект authenticator может быть заполнен необходимыми сведениями для продолжения соединения.
Замечание: невозможно использовать QueuedConnection для подключения к этому сигналу, так как соединение не удастся установить без заполнения информации для аутентификации при возвращении сигнала.
Эта функция была введена в Qt 4.3.
Смотрите также QAuthenticator и QNetworkProxy.
Возвращает размер внутреннего буфера чтения. Это ограничение определяет, какой объём данных может получить клиент, прежде чем вы вызовите read() или readAll().
Размер, равный 0 (по умолчанию), означает, что буфер не ограничен, что позволяет быть уверенным в том, что данные не потеряются.
Смотрите также setReadBufferSize() и read().
Устанавливает адрес локальной стороны соединения в address.
Вы можете вызывать эту функцию в подклассе QAbstractSocket для изменения возвращаемого значения функцией localAddress() после установления соединения. Эта функциональность также используется в прокси соединениях для создания виртуальных настроек соединения.
Помните, что эта функция не связывает локальный адрес сокета до соединения (например, QUdpSocket::bind()).
Эта функция была введена в Qt 4.1.
Смотрите также localAddress(), setLocalPort() и setPeerAddress().
Устанавливает локальный порт соединения в port.
Вы можете вызывать эту функцию в подклассе QAbstractSocket для изменения возвращаемого значения функцией localPort() после установления соединения. Эта функциональность также используется в прокси соединениях для создания виртуальных настроек соединения.
Помните, что эта функция не связывает локальный порт сокета до соединения (например, QUdpSocket::bind()).
Эта функция была введена в Qt 4.1.
Смотрите также localPort(), localAddress(), setLocalAddress() и setPeerPort().
Устанавливает адрес удалённой стороны соединения в address.
Вы можете вызывать эту функцию в подклассе QAbstractSocket для изменения возвращаемого значения функцией peerAddress() после установления соединения. Эта функциональность также используется в прокси соединениях для создания виртуальных настроек соединения.
Эта функция была введена в Qt 4.1.
Смотрите также peerAddress(), setPeerPort() и setLocalAddress().
Устанавливает имя удалённого узла в name.
Вы можете вызывать эту функцию в подклассе QAbstractSocket для изменения возвращаемого значения функцией peerName() после установления соединения. Эта функциональность также используется в прокси соединениях для создания виртуальных настроек соединения.
Эта функция была введена в Qt 4.1.
Смотрите также peerName().
Устанавливает порт удалённой стороны соединения в port.
Вы можете вызывать эту функцию в подклассе QAbstractSocket для изменения возвращаемого значения функцией peerPort() после установления соединения. Эта функциональность также используется в прокси соединениях для создания виртуальных настроек соединения.
Эта функция была введена в Qt 4.1.
Смотрите также peerPort(), setPeerAddress() и setLocalPort().
Устанавливает явно сетевой прокси для текущего сокета в networkProxy.
Для выключения использования прокси для текущего сокета используйте тип прокси QNetworkProxy::NoProxy:
socket->setProxy(QNetworkProxy::NoProxy);
Эта функция была введена в Qt 4.1.
Смотрите также proxy() и QNetworkProxy.
Устанавливает размер буфера QAbstractSocket чтения равным size байт.
Если установлен предел размера буфера, QAbstractSocket не будет помещать в буфер больше данных, чем этот предел. В частности, если размер буфер установлен как 0, предел не установлен, все поступающие данные буферизируются. Это значение по умолчанию.
Эта опция полезна, если вы хотите только читать данные в определённое время (например, в случае с потоковым приложением реального времени) или вы хотите защитить сокет от переполнения, что может привести к нехватке памяти.
Только QTcpSocket использует внутренний буфер QAbstractSocket; QUdpSocket не использует буферизацию вовсе, а скорее основывается на возможностях буферизации операционной системы. Потому вызов функции QUdpSocket не вызовет никакого эффекта.
Смотрите также readBufferSize() и read().
Инициализирует QAbstractSocket с родным дескриптором сокета socketDescriptor. Возвращает true, если socketDescriptor принят как валидный; в противном случае возвращает false. Сокет открывается в режиме, определённом в openMode, и переводится в состояние, определённое в socketState.
Замечание: невозможно инициализировать два абстрактных сокета с одинаковыми родными дескрипторами.
Смотрите также socketDescriptor().
Устанавливает тип последней произошедшей ошибки в socketError.
Смотрите также setSocketState() и setErrorString().
Устанавливает состояние сокета в state.
Смотрите также state().
Возвращает родной дескриптор сокета объекта QAbstractSocket, если он доступен; в противном случае возвращает -1.
Если сокет использует QNetworkProxy, возвращаемый дескриптор может быть недоступен для использования с родными функциями сокета.
Дескриптор сокета недоступен, когда QAbstractSocket находится в состоянии UnconnectedState.
Смотрите также setSocketDescriptor().
Возвращает тип сокета (TCP, UDP или другое).
Смотрите также QTcpSocket и QUdpSocket.
Возвращает состояние сокета.
Смотрите также error().
Этот сигнал испускается, когда изменяется состояние сокета QAbstractSocket. Параметр socketState является новым состоянием.
QAbstractSocket::SocketState не является зарегистрированным мета-типом, поэтому для очередей соединений вы должны зарегистрировать его с помощью Q_REGISTER_METATYPE.
Смотрите также state().
Ждёт msecs миллисекунд, пока установится соединение. Если соединение установлено, возвращает true; если нет - false. В случае, если функция возвращает false, вы можете вызвать error() для определения, что за ошибка произошла.
Следующий пример ждёт одну секунду для установления соединения:
socket->connectToHost("imap", 143); if (socket->waitForConnected(1000)) qDebug("Соединено!");
Если задать время тайм-аута как -1, таймер будет отключён.
Замечание: Эта функция может ждать немного дольше чем msecs, в зависимости от времени требуемого для завершения поиска узла.
Смотрите также connectToHost() и connected().
Ждёт msecs миллисекунд, пока сокет разорвёт соединение. Если соединение разорвано, функция возвращает true; если нет - false. В случае, если функция возвращает false, вы можете вызвать error() для определения, что за ошибка произошла.
Следующий пример ждёт до разрыва соединения одну секунду:
socket->disconnectFromHost(); if (socket->state() == QAbstractSocket::UnconnectedState || socket->waitForDisconnected(1000)) qDebug("Отсоединено!");
Если задать время тайм-аута как -1, таймер будет отключён.
Смотрите также disconnectFromHost() и close().
Эта функция блокирует сокет, пока данные, доступные для чтения, не будут прочитаны с помощью readyRead() и соответствующий сигнал не будет послан. Эта функция имеет таймаут msecs, заданныё в миллисекундах; по умолчанию он равен 3000 мс.
Функция возвращает true, если испущен сигнал readyRead() и имеются данные доступные для чтения; в противном случае она возвращает false (если произошла ошибка или превышен тайм-аут операции).
Переопределено из QIODevice.
Смотрите также waitForBytesWritten().
Copyright © 2008 Trolltech | Торговые марки | Qt 4.3.5 |