Класс QAbstractSocket
Класс QAbstractSocket предоставляет базовые функции, общие для всех типов сокетов. Подробнее...
| Заголовок: | #include <QAbstractSocket> |
| qmake: | QT += network |
| Наследуется от: | QIODevice |
| Наследует: |
Примечание: Все функции в этом классе являются перевходозащищёнными.
Открытые типы
| Перечисление | BindFlag { ShareAddress, DontShareAddress, ReuseAddressHint, DefaultForPlatform } |
| флаги | BindMode |
| Перечисление | NetworkLayerProtocol { IPv4Protocol, IPv6Protocol, AnyIPProtocol, UnknownNetworkLayerProtocol } |
| Перечисление | PauseMode { PauseNever, PauseOnSslErrors } |
| флаги | PauseModes |
| Перечисление | SocketError { ConnectionRefusedError, RemoteHostClosedError, HostNotFoundError, SocketAccessError, ..., UnknownSocketError } |
| Перечисление | SocketOption { LowDelayOption, KeepAliveOption, MulticastTtlOption, MulticastLoopbackOption, ..., ReceiveBufferSizeSocketOption } |
| Перечисление | SocketState { UnconnectedState, HostLookupState, ConnectingState, ConnectedState, ..., ListeningState } |
| Перечисление | SocketType { TcpSocket, UdpSocket, UnknownSocketType } |
Публичные функции
| QAbstractSocket(SocketType socketType, QObject *parent) | |
| virtual | ~QAbstractSocket() |
| void | abort() |
| bool | bind(const QHostAddress &address, quint16 port = 0, BindMode mode = DefaultForPlatform) |
| bool | bind(quint16 port = 0, BindMode mode = DefaultForPlatform) |
| virtual void | connectToHost(const QString &hostName, quint16 port, OpenMode openMode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol) |
| virtual void | connectToHost(const QHostAddress &address, quint16 port, OpenMode openMode = ReadWrite) |
| virtual void | disconnectFromHost() |
| SocketError | error() const |
| bool | flush() |
| bool | isValid() const |
| QHostAddress | localAddress() const |
| quint16 | localPort() const |
| PauseModes | pauseMode() const |
| QHostAddress | peerAddress() const |
| QString | peerName() const |
| quint16 | peerPort() const |
| QNetworkProxy | proxy() const |
| qint64 | readBufferSize() const |
| virtual void | resume() |
| void | setPauseMode(PauseModes pauseMode) |
| void | setProxy(const QNetworkProxy &networkProxy) |
| virtual void | setReadBufferSize(qint64 size) |
| virtual bool | setSocketDescriptor(qintptr socketDescriptor, SocketState socketState = ConnectedState, OpenMode openMode = ReadWrite) |
| virtual void | setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value) |
| virtual qintptr | socketDescriptor() const |
| virtual QVariant | socketOption(QAbstractSocket::SocketOption option) |
| SocketType | socketType() const |
| SocketState | state() const |
| virtual bool | waitForConnected(int msecs = 30000) |
| virtual bool | waitForDisconnected(int msecs = 30000) |
Реализованные публичные функции
| virtual bool | atEnd() const |
| virtual qint64 | bytesAvailable() const |
| virtual qint64 | bytesToWrite() const |
| virtual bool | canReadLine() const |
| virtual void | close() |
| virtual bool | isSequential() const |
| virtual bool | waitForBytesWritten(int msecs = 30000) |
| virtual bool | waitForReadyRead(int msecs = 30000) |
Сигналы
| void | connected() |
| void | disconnected() |
| void | error(QAbstractSocket::SocketError socketError) |
| void | hostFound() |
| void | proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator) |
| void | stateChanged(QAbstractSocket::SocketState socketState) |
Защищённые функции
| void | setLocalAddress(const QHostAddress &address) |
| void | setLocalPort(quint16 port) |
| void | setPeerAddress(const QHostAddress &address) |
| void | setPeerName(const QString &name) |
| void | setPeerPort(quint16 port) |
| void | setSocketError(SocketError socketError) |
| void | setSocketState(SocketState state) |
Реализованные защищённые функции
| virtual qint64 | readData(char *data, qint64 maxSize) |
| virtual qint64 | readLineData(char *data, qint64 maxlen) |
| virtual qint64 | writeData(const char *data, qint64 size) |
Дополнительные унаследованные члены
- 1 свойство унаследовано от QObject
- 1 публичный слот унаследован от QObject
- 11 статических публичных членов унаследовано от QObject
Подробное описание
Класс QAbstractSocket предоставляет базовые функции, общие для всех типов сокетов.
QAbstractSocket — это базовый класс для QTcpSocket и QUdpSocket и содержит все общие функции этих двух классов. Если вам нужен сокет, у вас есть два варианта:
- Инициализировать QTcpSocket или QUdpSocket.
- Создать дескриптор нативного сокета, инициализировать QAbstractSocket и вызвать setSocketDescriptor() для обертывания нативного сокета.
TCP (Протокол управления передачей) — это надёжный, потоковый, ориентированный на соединение транспортный протокол. UDP (Протокол пользовательских датаграмм) — это ненадежный, ориентированный на датаграммы, бессоединительный протокол. На практике это означает, что 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() испускается, когда данные были записаны в сокет. Обратите внимание, что Qt не ограничивает размер буфера записи. Вы можете отслеживать его размер, прослушивая этот сигнал.
Сигнал readyRead() испускается каждый раз, когда новый фрагмент данных прибывает. bytesAvailable() затем возвращает количество доступных для чтения байтов. Обычно вы подключаете сигнал readyRead() к слоту и читаете все доступные данные там. Если вы не читаете все данные сразу, оставшиеся данные по-прежнему будут доступны позже, а любые новые входящие данные будут добавлены к внутреннему буферу чтения QAbstractSocket. Для ограничения размера буфера чтения вызовите setReadBufferSize().
Чтобы закрыть сокет, вызовите disconnectFromHost(). QAbstractSocket переходит в состояние QAbstractSocket::ClosingState. После того, как все ожидающие данные были записаны в сокет, QAbstractSocket фактически закрывает сокет, переходит в QAbstractSocket::UnconnectedState и испускает disconnected(). Если вы хотите немедленно прервать соединение, отбросив все ожидающие данные, вызовите abort() вместо этого. Если удалённый хост закрывает соединение, QAbstractSocket выпустит ошибку (QAbstractSocket::RemoteHostClosedError), при этом состояние сокета всё ещё будет ConnectedState, а затем будет выпущен сигнал disconnected().
Порт и адрес подключённого узла получаются путём вызова peerPort() и peerAddress(). peerName() возвращает имя хоста узла, как передано в connectToHost(). localPort() и localAddress() возвращают порт и адрес локального сокета.
QAbstractSocket предоставляет набор функций, которые приостанавливают вызывающую нить, пока не будут испущены определённые сигналы. Эти функции могут использоваться для реализации блокирующих сокетов:
- waitForConnected() блокирует, пока соединение не будет установлено.
- waitForReadyRead() блокирует, пока новые данные не станут доступны для чтения.
- waitForBytesWritten() блокирует, пока один пакет данных не будет записан в сокет.
- waitForDisconnected() блокирует, пока соединение не будет закрыто.
Мы покажем пример:
int numRead = 0, numReadTotal = 0;
char buffer[50];
forever {
numRead = socket.read(buffer, 50);
// do whatever with array
numReadTotal += numRead;
if (numRead == 0 && !socket.waitForReadyRead())
break;
} Если waitForReadyRead() возвращает false, соединение было закрыто или произошла ошибка.
Программирование с блокирующим сокетом радикально отличается от программирования с неблокирующим сокетом. Блокирующий сокет не требует цикла событий и, как правило, приводит к более простому коду. Однако в приложении GUI блокирующие сокеты следует использовать только в потоках, не относящихся к GUI, чтобы избежать зависания пользовательского интерфейса. Обратитесь к примерам fortuneclient и blockingfortuneclient для обзора обоих подходов.
Примечание: Не рекомендуется использовать блокирующие функции вместе с сигналами. Следует использовать один из двух вариантов.
QAbstractSocket можно использовать с QTextStream и QDataStream операторами потока (operator<<() и operator>>()). Однако следует учитывать одну проблему: необходимо убедиться, что достаточно данных доступно перед попыткой их чтения с помощью оператора>>().
См. также QNetworkAccessManager и QTcpServer.
Документация по типам членов
enum QAbstractSocket::BindFlagflags QAbstractSocket::BindMode
Этот перечисление описывает различные флаги, которые можно передать для изменения поведения QAbstractSocket::bind().
| Постоянная | Значение | Описание |
|---|---|---|
QAbstractSocket::ShareAddress |
0x1 |
Разрешить другим службам привязываться к тому же адресу и порту. Это полезно, когда несколько процессов совместно загружают одну службу, прослушивая один и тот же адрес и порт (например, веб-сервер с несколькими предварительно разветвленными слушателями может значительно улучшить время отклика). Однако, поскольку любая служба может повторно привязаться, этот параметр имеет определенные соображения по безопасности. Обратите внимание, что объединение этого параметра с ReuseAddressHint также позволит вашей службе повторно привязаться к существующему общему адресу. В Unix это эквивалентно параметру сокета SO_REUSEADDR. В Windows этот параметр игнорируется. |
QAbstractSocket::DontShareAddress |
0x2 |
Привязать адрес и порт эксклюзивно, так что другие службы не смогут повторно привязаться. Передав этот параметр в QAbstractSocket::bind(), вы гарантируете, что в случае успеха ваша служба является единственной, прослушивающей адрес и порт. Никакие службы не смогут повторно привязаться, даже если они передают ReuseAddressHint. Этот параметр обеспечивает большую безопасность, чем ShareAddress, но на некоторых операционных системах он требует запуска сервера с правами администратора. В Unix и macOS по умолчанию не используется совместное использование привязки адреса и порта, поэтому этот параметр игнорируется. В Windows этот параметр использует параметр сокета SO_EXCLUSIVEADDRUSE. |
QAbstractSocket::ReuseAddressHint |
0x4 |
Предоставляет подсказку QAbstractSocket о том, что он должен попытаться повторно привязаться к службе, даже если адрес и порт уже привязаны другим сокетом. В Windows и Unix это эквивалентно параметру сокета SO_REUSEADDR. |
QAbstractSocket::DefaultForPlatform |
0x0 |
Параметр по умолчанию для текущей платформы. В Unix и macOS это эквивалентно (DontShareAddress + ReuseAddressHint), а в Windows — ShareAddress. |
Это перечисление было введено или изменено в Qt 5.0.
Тип BindMode — это тип-синоним для QFlags<BindFlag>. Он хранит логическое ИЛИ сочетание значений BindFlag.
enum QAbstractSocket::NetworkLayerProtocol
Это перечисление описывает значения протоколов сетевого уровня, используемые в Qt.
| Постоянная | Значение | Описание |
|---|---|---|
QAbstractSocket::IPv4Protocol |
0 |
IPv4 |
QAbstractSocket::IPv6Protocol |
1 |
IPv6 |
QAbstractSocket::AnyIPProtocol |
2 |
Либо IPv4, либо IPv6 |
QAbstractSocket::UnknownNetworkLayerProtocol |
-1 |
Другой, кроме IPv4 и IPv6 |
См. также QHostAddress::protocol().
enum QAbstractSocket::PauseModeflags QAbstractSocket::PauseModes
Это перечисление описывает поведение, когда сокет должен приостановить передачу данных. В настоящее время поддерживается только уведомление QSslSocket::sslErrors().
| Постоянная | Значение | Описание |
|---|---|---|
QAbstractSocket::PauseNever |
0x0 |
Не приостанавливать передачу данных по сокету. Это значение по умолчанию и соответствует поведению Qt 4. |
QAbstractSocket::PauseOnSslErrors |
0x1 |
Приостановить передачу данных по сокету при получении уведомления об ошибке SSL. Т.е. QSslSocket::sslErrors(). |
Это перечисление было введено или изменено в Qt 5.0.
Тип PauseModes — это тип-синоним для QFlags<PauseMode>. Он хранит логическое ИЛИ сочетание значений PauseMode.
enum QAbstractSocket::SocketError
Это перечисление описывает ошибки сокета, которые могут возникнуть.
| Постоянная | Значение | Описание |
|---|---|---|
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 |
Указанный адрес в QAbstractSocket::bind() уже используется и был установлен как эксклюзивный. |
QAbstractSocket::SocketAddressNotAvailableError |
9 |
Указанный адрес в QAbstractSocket::bind() не принадлежит узлу. |
QAbstractSocket::UnsupportedSocketOperationError |
10 |
Запрошенная операция с сокетом не поддерживается локальной операционной системой (например, отсутствует поддержка IPv6). |
QAbstractSocket::ProxyAuthenticationRequiredError |
12 |
Сокет использует прокси, и прокси требует аутентификации. |
QAbstractSocket::SslHandshakeFailedError |
13 |
Сбой рукопожатия SSL/TLS, поэтому соединение было закрыто (используется только в QSslSocket). |
QAbstractSocket::UnfinishedSocketOperationError |
11 |
Используется только QAbstractSocketEngine. Последняя попытка операции ещё не завершена (ещё выполняется в фоновом режиме). |
QAbstractSocket::ProxyConnectionRefusedError |
14 |
Не удалось установить соединение с сервером прокси, так как доступ к этому серверу был запрещен. |
QAbstractSocket::ProxyConnectionClosedError |
15 |
Соединение с прокси-сервером было неожиданно закрыто (до того, как было установлено соединение с конечным узлом). |
QAbstractSocket::ProxyConnectionTimeoutError |
16 |
Истекло время ожидания соединения с прокси-сервером или прокси-сервер перестал отвечать на этапе аутентификации. |
QAbstractSocket::ProxyNotFoundError |
17 |
Адрес прокси, заданный с помощью setProxy() (или прокси приложения), не найден. |
QAbstractSocket::ProxyProtocolError |
18 |
Не удалось согласовать соединение с прокси-сервером, так как ответ от прокси-сервера не удалось понять. |
QAbstractSocket::OperationError |
19 |
Попытка операции была выполнена, когда сокет находился в состоянии, которое её не допускало. |
QAbstractSocket::SslInternalError |
20 |
Используемая библиотека SSL сообщила об внутренней ошибке. Вероятно, это результат неправильной установки или конфигурации библиотеки. |
QAbstractSocket::SslInvalidUserDataError |
21 |
Были предоставлены некорректные данные (сертификат, ключ, шифр и т.д.), использование которых привело к ошибке в библиотеке SSL. |
QAbstractSocket::TemporaryError |
22 |
Возникла временная ошибка (например, операция заблокировалась, а сокет неблокирующий). |
QAbstractSocket::UnknownSocketError |
-1 |
Произошла неопределённая ошибка. |
См. также QAbstractSocket::error().
enum QAbstractSocket::SocketOption
Этот перечисление представляет опции, которые могут быть установлены для сокета. При желании их можно установить после получения сигнала connected() от сокета или после получения нового сокета от QTcpServer.
| Постоянная | Значение | Описание |
|---|---|---|
QAbstractSocket::LowDelayOption |
0 |
Попытка оптимизировать сокет для низкой задержки. Для QTcpSocket это установит опцию TCP_NODELAY и отключит алгоритм Нагля. Установите значение 1 для включения. |
QAbstractSocket::KeepAliveOption |
1 |
Установите это значение в 1 для включения опции SO_KEEPALIVE сокета. |
QAbstractSocket::MulticastTtlOption |
2 |
Установите это значение в целочисленное значение для установки опции сокета IP_MULTICAST_TTL (TTL для дейтаграмм мультивещания). |
QAbstractSocket::MulticastLoopbackOption |
3 |
Установите это значение в 1 для включения опции сокета IP_MULTICAST_LOOP (мультивещание по обратной петле). |
QAbstractSocket::TypeOfServiceOption |
4 |
Эта опция не поддерживается в Windows. Она соответствует опции сокета IP_TOS. Возможные значения см. в таблице ниже. |
QAbstractSocket::SendBufferSizeSocketOption |
5 |
Устанавливает размер буфера отправки сокета в байтах на уровне ОС. Это соответствует опции сокета SO_SNDBUF. Эта опция не влияет на буферы QIODevice или QAbstractSocket. Это значение перечисления было добавлено в Qt 5.3. |
QAbstractSocket::ReceiveBufferSizeSocketOption |
6 |
Устанавливает размер буфера приёма сокета в байтах на уровне ОС. Это соответствует опции сокета SO_RCVBUF. Эта опция не влияет на буферы QIODevice или QAbstractSocket (см. setReadBufferSize()). Это значение перечисления было добавлено в Qt 5.3. |
Возможные значения для TypeOfServiceOption:
| Значение | Описание |
|---|---|
| 224 | Управление сетью |
| 192 | Управление межсетевым соединением |
| 160 | CRITIC/ECP |
| 128 | Перекрытие вспышки |
| 96 | Вспышка |
| 64 | Немедленно |
| 32 | Приоритет |
| 0 | Обычное |
Это перечисление было введено или изменено в Qt 4.6.
См. также QAbstractSocket::setSocketOption() и QAbstractSocket::socketOption().
enum QAbstractSocket::SocketState
Это перечисление описывает различные состояния, в которых может находиться сокет.
| Постоянная | Значение | Описание |
|---|---|---|
QAbstractSocket::UnconnectedState |
0 |
Сокет не подключен. |
QAbstractSocket::HostLookupState |
1 |
Сокет выполняет поиск имени узла. |
QAbstractSocket::ConnectingState |
2 |
Сокет начал установку соединения. |
QAbstractSocket::ConnectedState |
3 |
Соединение установлено. |
QAbstractSocket::BoundState |
4 |
Сокет привязан к адресу и порту. |
QAbstractSocket::ClosingState |
6 |
Сокет закрывается (данные могут ещё ожидать записи). |
QAbstractSocket::ListeningState |
5 |
Для внутреннего использования только. |
См. также QAbstractSocket::state().
enum QAbstractSocket::SocketType
Это перечисление описывает протокол транспортного уровня.
END_OF_DOCUMENT_MARKER| Константа | Значение | Описание |
|---|---|---|
QAbstractSocket::TcpSocket |
0 |
TCP |
QAbstractSocket::UdpSocket |
1 |
UDP |
QAbstractSocket::UnknownSocketType |
-1 |
Другое, кроме TCP и UDP |
См. также QAbstractSocket::socketType().
Документация по функциям-членам
QAbstractSocket::QAbstractSocket(SocketType socketType, QObject *parent)
Создаёт новый абстрактный сокет типа socketType. Аргумент parent передаётся конструктору QObject.
См. также socketType(), QTcpSocket и QUdpSocket.
[virtual] QAbstractSocket::~QAbstractSocket()
Удаляет сокет.
void QAbstractSocket::abort()
Прерывает текущее подключение и сбрасывает сокет. В отличие от disconnectFromHost(), эта функция немедленно закрывает сокет, отбрасывая любые ожидающие данные в буфере записи.
См. также disconnectFromHost() и close().
[virtual] bool QAbstractSocket::atEnd() const
Переопределено из QIODevice::atEnd().
Возвращает true , если больше нет доступных данных для чтения; в противном случае возвращает false.
Эта функция чаще всего используется при чтении данных из сокета в цикле. Например:
// This slot is connected to QAbstractSocket::readyRead()
void SocketClass::readyReadSlot()
{
while (!socket.atEnd()) {
QByteArray data = socket.read(100);
....
}
} См. также bytesAvailable() и readyRead().
bool QAbstractSocket::bind(const QHostAddress &address, quint16 port = 0, BindMode mode = DefaultForPlatform)
Привязывается к address на порту port, используя режим BindMode mode.
Привязывает этот сокет к адресу address и порту port.
Для UDP-сокетов после привязки сигнал QUdpSocket::readyRead() генерируется всякий раз, когда приходит UDP-датаграмма на указанный адрес и порт. Таким образом, эта функция полезна для написания UDP-серверов.
Для TCP-сокетов эта функция может использоваться для указания интерфейса, используемого для исходящего подключения, что полезно в случае нескольких сетевых интерфейсов.
По умолчанию сокет привязывается с помощью BindMode DefaultForPlatform. Если порт не указан, выбирается случайный порт.
В случае успеха функция возвращает true, и сокет переходит в состояние BoundState; в противном случае возвращает false.
Функция была добавлена в Qt 5.0.
bool QAbstractSocket::bind(quint16 port = 0, BindMode mode = DefaultForPlatform)
Это перегруженная функция.
Привязывается к QHostAddress:Any на порту port, используя режим BindMode mode.
По умолчанию сокет привязывается с помощью BindMode DefaultForPlatform. Если порт не указан, выбирается случайный порт.
Функция была добавлена в Qt 5.0.
[virtual] qint64 QAbstractSocket::bytesAvailable() const
Переопределено из QIODevice::bytesAvailable().
Возвращает количество входящих байтов, ожидающих чтения.
См. также bytesToWrite() и read().
[virtual] qint64 QAbstractSocket::bytesToWrite() const
Переопределено из QIODevice::bytesToWrite().
Возвращает количество байтов, ожидающих записи. Байты записываются, когда управление возвращается в цикл событий или когда вызывается flush().
См. также bytesAvailable() и flush().
[virtual] bool QAbstractSocket::canReadLine() const
Переопределено из QIODevice::canReadLine().
Возвращает true , если строка данных может быть прочитана из сокета; в противном случае возвращает false.
См. также readLine().
[virtual] void QAbstractSocket::close()
Переопределено из QIODevice::close().
Закрывает устройство ввода-вывода для сокета, отключает подключение сокета к хосту, закрывает сокет и сбрасывает имя, адрес, номер порта и дескриптор подлежащего сокета.
См. QIODevice::close() для описания действий, которые выполняются при закрытии устройства ввода-вывода.
См. также abort().
[virtual] void QAbstractSocket::connectToHost(const QString &hostName, quint16 port, OpenMode openMode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol)
Попытка установить подключение к hostName на указанном port. Параметр protocol может быть использован для указания сетевого протокола (например, IPv4 или IPv6).
Сокет открывается в заданном openMode и сначала переходит в состояние HostLookupState, затем выполняет поиск имени хоста hostName. Если поиск успешен, генерируется hostFound() и QAbstractSocket переходит в состояние ConnectingState. Затем он пытается подключиться к адресу или адресам, возвращённым результатом поиска. Наконец, если подключение установлено, QAbstractSocket переходит в состояние ConnectedState и генерирует connected().
В любой момент сокет может генерировать error(), чтобы сигнализировать об ошибке.
hostName может быть IP-адресом в строковом формате (например, "43.195.83.32") или именем хоста (например, "example.com"). QAbstractSocket выполнит поиск только если это необходимо. port указан в родном порядке байтов.
См. также state(), peerName(), peerAddress(), peerPort() и waitForConnected().
[virtual] void QAbstractSocket::connectToHost(const QHostAddress &address, quint16 port, OpenMode openMode = ReadWrite)
Это перегруженная функция.
Попытка установить подключение к address на порту port.
[signal] void QAbstractSocket::connected()
Этот сигнал генерируется после вызова connectToHost() и успешного установления подключения.
Примечание: На некоторых операционных системах сигнал connected() может быть сгенерирован непосредственно в вызове connectToHost() для подключений к localhost.
См. также connectToHost() и disconnected().
[virtual] void QAbstractSocket::disconnectFromHost()
Попытка закрыть сокет. Если ожидающие данные для записи, QAbstractSocket перейдёт в состояние ClosingState и подождёт, пока все данные не будут записаны. В конечном итоге он перейдёт в состояние UnconnectedState и сгенерирует сигнал disconnected().
См. также connectToHost().
[signal] void QAbstractSocket::disconnected()
Этот сигнал генерируется при отключении сокета.
Предупреждение: Если вам нужно удалить sender() этого сигнала в слоте, подключённом к нему, используйте функцию deleteLater().
См. также connectToHost(), disconnectFromHost() и abort().
SocketError QAbstractSocket::error() const
Возвращает тип последней произошедшей ошибки.
См. также state() и errorString().
END_OF_DOCUMENT_MARKER
[signal] void QAbstractSocket::error(QAbstractSocket::SocketError socketError)
Этот сигнал излучается после возникновения ошибки. Параметр socketError описывает тип произошедшей ошибки.
При излучении этого сигнала сокет может быть не готов к попытке повторного подключения. В этом случае попытки повторного подключения следует выполнять из цикла обработки событий. Например, используйте QTimer::singleShot() с 0 в качестве значения таймаута.
QAbstractSocket::SocketError — это не зарегистрированный метатип, поэтому для очереди соединений вам необходимо зарегистрировать его с помощью Q_DECLARE_METATYPE() и qRegisterMetaType().
Примечание: Сигнал error перегружен в этом классе. Чтобы подключиться к этому сигналу с помощью синтаксиса указателя на функцию, необходимо указать тип сигнала в статическом приведении, как показано в этом примере:
connect(abstractSocket, static_cast<void(QAbstractSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error),
[=](QAbstractSocket::SocketError socketError){ /* ... */ }); См. также error(), errorString() и Создание пользовательских типов Qt.
bool QAbstractSocket::flush()
Эта функция записывает как можно больше данных из внутреннего буфера записи в сетевой сокет, не блокируя выполнение. Если какие-либо данные были записаны, эта функция возвращает true; в противном случае возвращает false.
Вызовите эту функцию, если вам нужно, чтобы QAbstractSocket немедленно начал отправлять буферизованные данные. Количество успешно записанных байтов зависит от операционной системы. В большинстве случаев вызывать эту функцию не нужно, потому что QAbstractSocket начнёт отправлять данные автоматически, как только управление вернётся в цикл обработки событий. В отсутствие цикла обработки событий используйте waitForBytesWritten() вместо этого.
См. также write() и waitForBytesWritten().
[signal] void QAbstractSocket::hostFound()
Этот сигнал излучается после вызова connectToHost() и успешного поиска хоста.
Примечание: Начиная с Qt 4.6.3, QAbstractSocket может излучать hostFound() непосредственно из вызова connectToHost(), так как результат DNS может быть кэширован.
См. также connected().
[virtual] bool QAbstractSocket::isSequential() const
Переопределено из QIODevice::isSequential().
bool QAbstractSocket::isValid() const
Возвращает true, если сокет валиден и готов к использованию; в противном случае возвращает false.
Примечание: Состояние сокета должно быть ConnectedState перед чтением и записью.
См. также state().
QHostAddress QAbstractSocket::localAddress() const
Возвращает адрес хоста локального сокета, если он доступен; в противном случае возвращает QHostAddress::Null.
Обычно это основной IP-адрес хоста, но может быть QHostAddress::LocalHost (127.0.0.1) для подключений к локальному хосту.
См. также localPort(), peerAddress() и setLocalAddress().
quint16 QAbstractSocket::localPort() const
Возвращает номер порта хоста локального сокета (в родном порядке байтов), если он доступен; в противном случае возвращает 0.
См. также localAddress(), peerPort() и setLocalPort().
PauseModes QAbstractSocket::pauseMode() const
Возвращает режим паузы этого сокета.
Эта функция была добавлена в Qt 5.0.
См. также setPauseMode() и resume().
QHostAddress QAbstractSocket::peerAddress() const
Возвращает адрес подключённого удалённого узла, если сокет находится в состоянии ConnectedState; в противном случае возвращает QHostAddress::Null.
См. также peerName(), peerPort(), localAddress() и setPeerAddress().
QString QAbstractSocket::peerName() const
Возвращает имя удалённого узла, указанное в connectToHost(), или пустую строку QString, если connectToHost() не был вызван.
См. также peerAddress(), peerPort() и setPeerName().
quint16 QAbstractSocket::peerPort() const
Возвращает порт подключённого удалённого узла, если сокет находится в состоянии ConnectedState; в противном случае возвращает 0.
См. также peerAddress(), localPort() и setPeerPort().
QNetworkProxy QAbstractSocket::proxy() const
Возвращает сетевой прокси для этого сокета. По умолчанию используется QNetworkProxy::DefaultProxy, что означает, что этот сокет будет запрашивать настройки прокси по умолчанию для приложения.
Эта функция была добавлена в Qt 4.1.
См. также setProxy(), QNetworkProxy и QNetworkProxyFactory.
[signal] void QAbstractSocket::proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)
Этот сигнал может излучаться, когда используется прокси, требующий аутентификации. Объект authenticator может быть затем заполнен необходимыми данными для аутентификации и продолжения соединения.
Примечание: Невозможно использовать QueuedConnection для подключения к этому сигналу, так как соединение завершится неудачно, если объект authenticator не будет заполнен новой информацией к моменту возвращения сигнала.
Эта функция была добавлена в Qt 4.3.
См. также QAuthenticator и QNetworkProxy.
qint64 QAbstractSocket::readBufferSize() const
Возвращает размер внутреннего буфера чтения. Это ограничивает количество данных, которые клиент может получить, прежде чем вы вызовете read() или readAll().
Размер буфера чтения 0 (по умолчанию) означает, что буфер не имеет ограничений по размеру, гарантируя, что данные не потеряются.
См. также setReadBufferSize() и read().
[virtual protected] qint64 QAbstractSocket::readData(char *data, qint64 maxSize)
Переопределено из QIODevice::readData().
[virtual protected] qint64 QAbstractSocket::readLineData(char *data, qint64 maxlen)
Переопределено из QIODevice::readLineData().
[virtual] void QAbstractSocket::resume()
Продолжает передачу данных по сокету. Этот метод должен использоваться только после того, как сокет был приостановлен при получении уведомлений и получено уведомление. В настоящее время поддерживается только уведомление QSslSocket::sslErrors(). Вызов этого метода, если сокет не приостановлен, приводит к неопределённому поведению.
Эта функция была добавлена в Qt 5.0.
См. также pauseMode() и setPauseMode().
[protected] void QAbstractSocket::setLocalAddress(const QHostAddress &address)
Устанавливает адрес на локальной стороне соединения в address.
Вы можете вызвать эту функцию в подклассе QAbstractSocket, чтобы изменить возвращаемое значение функции localAddress() после установления соединения. Эта функция обычно используется подключениями через прокси для настройки виртуальных соединений.
Обратите внимание, что эта функция не связывает локальный адрес сокета до соединения (например, QAbstractSocket::bind()).
Эта функция была добавлена в Qt 4.1.
См. также localAddress(), setLocalPort() и setPeerAddress().
[protected] void QAbstractSocket::setLocalPort(quint16 port)
Устанавливает порт на локальной стороне соединения в порт.
Вы можете вызвать эту функцию в подклассе QAbstractSocket, чтобы изменить возвращаемое значение функции localPort() после установления соединения. Эта функция обычно используется для прокси-соединений для настройки виртуальных соединений.
Обратите внимание, что эта функция не связывает локальный порт сокета перед соединением (например, QAbstractSocket::bind()).
Эта функция была введена в Qt 4.1.
См. также localPort(), localAddress(), setLocalAddress() и setPeerPort().
void QAbstractSocket::setPauseMode(PauseModes pauseMode)
Управляет приостановкой при получении уведомления. Параметр pauseMode определяет условия, при которых сокет должен быть приостановлен. В настоящее время поддерживается только уведомление QSslSocket::sslErrors(). Если установлено значение PauseOnSslErrors, передача данных по сокету будет приостановлена и должна быть снова включена явно с помощью вызова resume(). По умолчанию этот параметр установлен в PauseNever. Этот параметр должен быть задан до подключения к серверу, в противном случае это приведёт к неопределённому поведению.
Эта функция была введена в Qt 5.0.
См. также pauseMode() и resume().
[protected] void QAbstractSocket::setPeerAddress(const QHostAddress &address)
Устанавливает адрес удалённой стороны соединения на address.
Вы можете вызвать эту функцию в подклассе QAbstractSocket, чтобы изменить возвращаемое значение функции peerAddress() после установления соединения. Эта функция обычно используется для прокси-соединений для настройки виртуальных соединений.
Эта функция была введена в Qt 4.1.
См. также peerAddress(), setPeerPort() и setLocalAddress().
[protected] void QAbstractSocket::setPeerName(const QString &name)
Устанавливает имя хоста удалённого узла на name.
Вы можете вызвать эту функцию в подклассе QAbstractSocket, чтобы изменить возвращаемое значение функции peerName() после установления соединения. Эта функция обычно используется для прокси-соединений для настройки виртуальных соединений.
Эта функция была введена в Qt 4.1.
См. также peerName().
[protected] void QAbstractSocket::setPeerPort(quint16 port)
Устанавливает порт удалённой стороны соединения на port.
Вы можете вызвать эту функцию в подклассе QAbstractSocket, чтобы изменить возвращаемое значение функции peerPort() после установления соединения. Эта функция обычно используется для прокси-соединений для настройки виртуальных соединений.
Эта функция была введена в Qt 4.1.
См. также peerPort(), setPeerAddress() и setLocalPort().
void QAbstractSocket::setProxy(const QNetworkProxy &networkProxy)
Устанавливает явным прокси-сервером для этого сокета networkProxy.
Чтобы отключить использование прокси-сервера для этого сокета, используйте тип прокси QNetworkProxy::NoProxy:
socket->setProxy(QNetworkProxy::NoProxy);
Значение по умолчанию для прокси — QNetworkProxy::DefaultProxy, что означает, что сокет будет использовать параметры приложения: если прокси установлен с помощью QNetworkProxy::setApplicationProxy, он будет использоваться; в противном случае, если фабрика установлена с помощью QNetworkProxyFactory::setApplicationProxyFactory, он запросит эту фабрику с типом QNetworkProxyQuery::TcpSocket.
Эта функция была введена в Qt 4.1.
См. также proxy(), QNetworkProxy и QNetworkProxyFactory::queryProxy().
[virtual] void QAbstractSocket::setReadBufferSize(qint64 size)
Устанавливает размер внутреннего буфера чтения QAbstractSocket в size байтов.
Если размер буфера ограничен определенным размером, QAbstractSocket не будет буферизовать больше данных, чем этот размер. В исключительных случаях, размер буфера 0 означает, что буфер чтения не ограничен и все входящие данные буферизуются. Это значение по умолчанию.
Этот параметр полезен, если вы читаете данные только в определенные моменты времени (например, в приложении для потоковой передачи в реальном времени) или если вы хотите защитить сокет от получения слишком большого объема данных, что может в конечном итоге привести к недостатку памяти в вашем приложении.
Только QTcpSocket использует внутренний буфер QAbstractSocket; QUdpSocket вообще не использует буферизацию, а полагается на неявную буферизацию, предоставляемую операционной системой. По этой причине вызов этой функции для QUdpSocket не оказывает никакого эффекта.
См. также readBufferSize() и read().
[virtual] bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, SocketState socketState = ConnectedState, OpenMode openMode = ReadWrite)
Инициализирует QAbstractSocket с помощью дескриптора родного сокета socketDescriptor. Возвращает true если socketDescriptor принят как действительный дескриптор сокета; в противном случае возвращает false. Сокет открывается в режиме, указанном параметром openMode, и переходит в состояние сокета, указанное параметром socketState. Буферы чтения и записи очищаются, отбрасывая любые ожидающие данные.
Примечание: Невозможно инициализировать два абстрактных сокета с одним и тем же дескриптором родного сокета.
См. также socketDescriptor().
[protected] void QAbstractSocket::setSocketError(SocketError socketError)
Устанавливает тип ошибки, которая произошла последний, на socketError.
См. также setSocketState() и setErrorString().
[virtual] void QAbstractSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)
Устанавливает заданный параметр option в значение, описанное параметром value.
Примечание: В Windows Runtime QAbstractSocket::KeepAliveOption необходимо установить перед подключением сокета.
Эта функция была введена в Qt 4.6.
См. также socketOption().
[protected] void QAbstractSocket::setSocketState(SocketState state)
Устанавливает состояние сокета в state.
См. также state().
[virtual] qintptr QAbstractSocket::socketDescriptor() const
Возвращает дескриптор родного сокета объекта QAbstractSocket, если он доступен; в противном случае возвращает -1.
Если сокет использует QNetworkProxy, возвращаемый дескриптор может быть не пригодным для использования с функциями родных сокетов.
Дескриптор сокета недоступен, когда QAbstractSocket находится в состоянии UnconnectedState.
См. также setSocketDescriptor().
[virtual] QVariant QAbstractSocket::socketOption(QAbstractSocket::SocketOption option)
Возвращает значение параметра option.
Эта функция была введена в Qt 4.6.
См. также setSocketOption().
SocketType QAbstractSocket::socketType() const
Возвращает тип сокета (TCP, UDP или другой).
См. также QTcpSocket и QUdpSocket.
SocketState QAbstractSocket::state() const
Возвращает состояние сокета.
См. также error().
[signal] void QAbstractSocket::stateChanged(QAbstractSocket::SocketState socketState)
Этот сигнал испускается всякий раз, когда состояние QAbstractSocket изменяется. Параметр socketState — это новое состояние.
QAbstractSocket::SocketState — это не зарегистрированный метатип, поэтому для очередей подключений вам нужно зарегистрировать его с помощью Q_DECLARE_METATYPE() и qRegisterMetaType().
См. также state() и Создание пользовательских типов Qt.
[virtual] bool QAbstractSocket::waitForBytesWritten(int msecs = 30000)
Переопределено из QIODevice::waitForBytesWritten().
Эта функция блокируется, пока не будет записан хотя бы один байт в сокет и не будет испущен сигнал bytesWritten(). Функция будет ожидать до msecs миллисекунд; время ожидания по умолчанию составляет 30000 миллисекунд.
Функция возвращает true если сигнал bytesWritten() испущен; в противном случае возвращает false (если произошла ошибка или операция превысила время ожидания).
Примечание: Эта функция может случайным образом завершаться неудачей в Windows. Рассмотрите использование цикла событий и сигнала bytesWritten() в случае, если ваш софт будет работать под Windows.
См. также waitForReadyRead().
[virtual] bool QAbstractSocket::waitForConnected(int msecs = 30000)
Ожидает подключения сокета до msecs миллисекунд. Если подключение установлено, эта функция возвращает true; в противном случае она возвращает false. В случае возвращения false, вы можете вызвать error() для определения причины ошибки.
Следующий пример ожидает до одной секунды установления подключения:
socket->connectToHost("imap", 143);
if (socket->waitForConnected(1000))
qDebug("Connected!"); Если msecs равно -1, эта функция не будет ожидать таймаут.
Примечание: Эта функция может ожидать немного дольше, чем msecs, в зависимости от времени, необходимого для завершения поиска хоста.
Примечание: Многократные вызовы этой функции не накапливают время ожидания. Если функция завершается по таймауту, процесс подключения прерывается.
Примечание: Эта функция может случайным образом завершаться неудачей в Windows. Рассмотрите использование цикла событий и сигнала connected() в случае, если ваш софт будет работать под Windows.
См. также connectToHost() и connected().
[virtual] bool QAbstractSocket::waitForDisconnected(int msecs = 30000)
Ожидает завершения отключения сокета в течение msecs миллисекунд. Если подключение было отключено, эта функция возвращает true; в противном случае она возвращает false. В случае возвращения false, вы можете вызвать error() для определения причины ошибки.
Следующий пример ожидает до одной секунды закрытия подключения:
socket->disconnectFromHost();
if (socket->state() == QAbstractSocket::UnconnectedState ||
socket->waitForDisconnected(1000))
qDebug("Disconnected!"); Если msecs равно -1, эта функция не будет ожидать таймаут.
Примечание: Эта функция может случайным образом завершаться неудачей в Windows. Рассмотрите использование цикла событий и сигнала disconnected() в случае, если ваш софт будет работать под Windows.
См. также disconnectFromHost() и close().
[virtual] bool QAbstractSocket::waitForReadyRead(int msecs = 30000)
Переопределено из QIODevice::waitForReadyRead().
Эта функция блокируется, пока не появятся новые данные для чтения и не будет испущен сигнал readyRead(). Функция будет ожидать до msecs миллисекунд; время ожидания по умолчанию составляет 30000 миллисекунд.
Функция возвращает true если сигнал readyRead() испущен и новые данные доступны для чтения; в противном случае она возвращает false (если произошла ошибка или операция превысила время ожидания).
Примечание: Эта функция может случайным образом завершаться неудачей в Windows. Рассмотрите использование цикла событий и сигнала readyRead() в случае, если ваш софт будет работать под Windows.
См. также waitForBytesWritten().
[virtual protected] qint64 QAbstractSocket::writeData(const char *data, qint64 size)
Переопределено из QIODevice::writeData().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/qabstractsocket.html