The QAbstractSocket 類提供所有套接字類型共有的基功能。 更多...
| 頭: | #include <QAbstractSocket> |
| qmake: | QT += network |
| 繼承: | QIODevice |
| 繼承者: | QTcpSocket and QUdpSocket |
注意: 此類的所有函數 可重入 .
| enum | BindFlag { ShareAddress, DontShareAddress, ReuseAddressHint, DefaultForPlatform } |
| flags | BindMode |
| enum | NetworkLayerProtocol { IPv4Protocol, IPv6Protocol, AnyIPProtocol, UnknownNetworkLayerProtocol } |
| enum | PauseMode { PauseNever, PauseOnSslErrors } |
| flags | PauseModes |
| enum | SocketError { ConnectionRefusedError, RemoteHostClosedError, HostNotFoundError, SocketAccessError, ..., UnknownSocketError } |
| enum | SocketOption { LowDelayOption, KeepAliveOption, MulticastTtlOption, MulticastLoopbackOption, ..., PathMtuSocketOption } |
| enum | SocketState { UnconnectedState, HostLookupState, ConnectingState, ConnectedState, ..., ListeningState } |
| enum | SocketType { TcpSocket, UdpSocket, SctpSocket, UnknownSocketType } |
| QAbstractSocket (QAbstractSocket::SocketType socketType , QObject * parent ) | |
| virtual | ~QAbstractSocket () |
| void | abort () |
| bool | bind (const QHostAddress & address , quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform) |
| bool | bind (quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform) |
| virtual void | connectToHost (const QString & hostName , quint16 port , QIODevice::OpenMode openMode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol) |
| virtual void | connectToHost (const QHostAddress & address , quint16 port , QIODevice::OpenMode openMode = ReadWrite) |
| virtual void | disconnectFromHost () |
| QAbstractSocket::SocketError | error () const |
| bool | flush () |
| bool | isValid () const |
| QHostAddress | localAddress () const |
| quint16 | localPort () const |
| QAbstractSocket::PauseModes | pauseMode () const |
| QHostAddress | peerAddress () const |
| QString | peerName () const |
| quint16 | peerPort () const |
| QNetworkProxy | proxy () const |
| qint64 | readBufferSize () const |
| virtual void | resume () |
| void | setPauseMode (QAbstractSocket::PauseModes pauseMode ) |
| void | setProxy (const QNetworkProxy & networkProxy ) |
| virtual void | setReadBufferSize (qint64 size ) |
| virtual bool | setSocketDescriptor (qintptr socketDescriptor , QAbstractSocket::SocketState socketState = ConnectedState, QIODevice::OpenMode openMode = ReadWrite) |
| virtual void | setSocketOption (QAbstractSocket::SocketOption option , const QVariant & value ) |
| virtual qintptr | socketDescriptor () const |
| virtual QVariant | socketOption (QAbstractSocket::SocketOption option ) |
| QAbstractSocket::SocketType | socketType () const |
| QAbstractSocket::SocketState | state () const |
| virtual bool | waitForConnected (int msecs = 30000) |
| virtual bool | waitForDisconnected (int msecs = 30000) |
| virtual bool | atEnd () const override |
| virtual qint64 | bytesAvailable () const override |
| virtual qint64 | bytesToWrite () const override |
| virtual bool | canReadLine () const override |
| virtual void | close () override |
| virtual bool | isSequential () const override |
| virtual bool | waitForBytesWritten (int msecs = 30000) override |
| virtual bool | waitForReadyRead (int msecs = 30000) override |
| void | connected () |
| void | disconnected () |
| void | error (QAbstractSocket::SocketError socketError ) |
| void | hostFound () |
| void | proxyAuthenticationRequired (const QNetworkProxy & proxy , QAuthenticator * authenticator ) |
| void | stateChanged (QAbstractSocket::SocketState socketState ) |
| const QMetaObject | staticMetaObject |
| 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 (QAbstractSocket::SocketError socketError ) |
| void | setSocketState (QAbstractSocket::SocketState state ) |
| virtual qint64 | readData (char * data , qint64 maxSize ) override |
| virtual qint64 | readLineData (char * data , qint64 maxlen ) override |
| virtual qint64 | writeData (const char * data , qint64 size ) override |
The QAbstractSocket 類提供所有套接字類型共有的基功能。
QAbstractSocket 是基類對於 QTcpSocket and QUdpSocket 且包含這 2 個類的全部共有功能。若需要套接字,有 2 個選項:
TCP (傳輸控製協議) 是可靠、麵嚮流、麵嚮連接的傳輸協議。UDP (用戶數據報協議) 是不可靠,麵嚮數據報的無連接協議。在實踐中,這意味著 TCP 更適閤連續數據傳輸,可以使用更輕量的 UDP 當可靠性不重要時。
QAbstractSocket 的 API 統一瞭這 2 種協議之間的大部分差異。例如,盡管 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 不限製寫入緩衝大小。可以監視其大小,通過監聽此信號。
The readyRead () 信號發射,每當有新數據分塊到達時。 bytesAvailable () 然後返迴可供讀取的字節數。通常,將連接 readyRead () 信號到槽並在那裏讀取所有可用數據。若一次不讀取所有數據,剩餘數據稍後將仍可用,且任何新傳入數據會被追加到 QAbstractSocket 的內部讀取緩衝。要限製讀取緩衝的大小,調用 setReadBufferSize ().
要關閉套接字,調用 disconnectFromHost (). QAbstractSocket 進入 QAbstractSocket::ClosingState 。在將所有待決數據寫入套接字後, QAbstractSocket 實際關閉套接字,進入 QAbstractSocket::UnconnectedState ,和發射 disconnected ()。若想要立即中止連接,丟棄所有待決數據,調用 abort () 取而代之。若遠程主機關閉連接, QAbstractSocket 將發射 error( 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);
// do whatever with array
numReadTotal += numRead;
if (numRead == 0 && !socket.waitForReadyRead())
break;
}
若
waitForReadyRead()
返迴
false
,連接已關閉 (或齣現錯誤)。
按阻塞套接字編程徹底異於按非阻塞套接字編程。阻塞套接字不要求事件循環,且通常導緻更簡單代碼。不管怎樣,在 GUI 應用程序中,阻塞套接字隻應用於非 GUI 綫程,以避免凍結用戶界麵。見 fortuneclient and blockingfortuneclient 範例瞭解這 2 種方式的概述。
注意: 不鼓勵將阻塞函數與信號一起使用。應該使用 2 種可能性之一。
QAbstractSocket 可以使用 QTextStream and QDataStream 的流運算符 (operator<<() 和 operator>>())。不過,有一個問題要注意:必須確保足夠的數據可用,先於嘗試讀取它使用 operator>>()。
另請參閱 QNetworkAccessManager and QTcpServer .
此枚舉描述的不同標誌可以傳遞給行為修改 QAbstractSocket::bind ().
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractSocket::ShareAddress
|
0x1
|
允許把其它服務綁定到相同地址和端口。這很有用,當多個進程通過監聽相同地址和端口以共享單個服務的負載時 (如:帶有幾個預分叉監聽器的 Web 服務器,可以大大改進響應時間)。不管怎樣,由於任何服務都允許重新綁定,所以,此選項需要考慮某些安全性。注意,通過組閤此選項與 ReuseAddressHint,還允許服務重新綁定現有共享地址。在 Unix,這相當於 SO_REUSEADDR 套接字選項。在 Windows,這是默認行為,所以此選項被忽略。 |
QAbstractSocket::DontShareAddress
|
0x2
|
獨占綁定地址和端口,所以不允許重新綁定其它服務。通過將此選項傳遞給 QAbstractSocket::bind (), you are guaranteed that on successs, your service is the only one that listens to the address and port. No services are allowed to rebind, even if they pass ReuseAddressHint. This option provides more security than ShareAddress, but on certain operating systems, it requires you to run the server with administrator privileges. On Unix and macOS , not sharing is the default behavior for binding an address and port, so this option is ignored. On Windows, this option uses the SO_EXCLUSIVEADDRUSE socket option. |
QAbstractSocket::ReuseAddressHint
|
0x4
|
提供提示為 QAbstractSocket 應該試著重新綁定服務,即使地址和端口已被另一套接字綁定。在 Windows 和 Unix,這相當於 SO_REUSEADDR 套接字選項。 |
QAbstractSocket::DefaultForPlatform
|
0x0
|
The default option for the current platform. On Unix and macOS , this is equivalent to (DontShareAddress + ReuseAddressHint), and on Windows, it is equivalent to ShareAddress. |
該枚舉在 Qt 5.0 引入或被修改。
BindMode 類型是 typedef 對於 QFlags <BindFlag>。它存儲 BindFlag 值的 OR (或) 組閤。
此枚舉描述用於 Qt 的網絡層協議值。
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractSocket::IPv4Protocol
|
0
|
IPv4 |
QAbstractSocket::IPv6Protocol
|
1
|
IPv6 |
QAbstractSocket::AnyIPProtocol
|
2
|
IPv4 或 IPv6 |
QAbstractSocket::UnknownNetworkLayerProtocol
|
-1
|
除瞭 IPv4 和 IPv6 |
另請參閱 QHostAddress::protocol ().
此枚舉描述套接字應繼續持有數據傳輸的行為。目前支持的唯一通知是 QSslSocket::sslErrors ().
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractSocket::PauseNever
|
0x0
|
不要暫停套接字中的數據傳輸。這是默認的,且匹配 Qt 4 的行為。 |
QAbstractSocket::PauseOnSslErrors
|
0x1
|
暫停套接字數據傳輸,當收到 SSL 錯誤通知時。即 QSslSocket::sslErrors (). |
該枚舉在 Qt 5.0 引入或被修改。
PauseModes 類型是 typedef 對於 QFlags <PauseMode>。它存儲 PauseMode 值的 OR 組閤。
此枚舉描述可以發生的套接字錯誤。
| 常量 | 值 | 描述 |
|---|---|---|
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
|
本地 OS 不支持請求的套接字操作 (如:缺乏 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 ().
此枚舉錶示套接字可以設置的選項。若期望,可以設置它們後於收到 connected () 信號從套接字或後於收到新套接字從 QTcpServer .
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractSocket::LowDelayOption
|
0
|
試著優化套接字為低延遲。對於 QTcpSocket 這將設置 TCP_NODELAY 選項並禁用 Nagle 算法。將此設為 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
|
在 OS 級彆以字節為單位設置套接字發送緩衝大小。這映射到 SO_SNDBUF 套接字選項。此選項不影響 QIODevice or QAbstractSocket 緩衝。該枚舉值在 Qt 5.3 引入。 |
QAbstractSocket::ReceiveBufferSizeSocketOption
|
6
|
在 OS 級彆以字節為單位設置套接字接收緩衝大小。這映射到 SO_RCVBUF 套接字選項。此選項不影響 QIODevice or QAbstractSocket 緩衝 (見 setReadBufferSize() )。該枚舉值在 Qt 5.3 引入。 |
QAbstractSocket::PathMtuSocketOption
|
7
|
檢索 IP 堆棧目前已知的 PMTU (路徑最大傳輸單元) 值,若有的話。某些 IP 堆棧還允許為傳輸設置 MTU (最大傳輸單元)。該枚舉值在 Qt 5.11 引入。 |
可能的值對於 TypeOfServiceOption 是:
| 值 | 描述 |
|---|---|
| 224 | 網絡控製 |
| 192 | 網間控製 |
| 160 | CRITIC/ECP |
| 128 | 刷新覆寫 |
| 96 | Flash |
| 64 | 立即 |
| 32 | 優先級 |
| 0 | 例程 |
該枚舉在 Qt 4.6 引入或被修改。
另請參閱 QAbstractSocket::setSocketOption () 和 QAbstractSocket::socketOption ().
此枚舉描述套接字可以處於的不同狀態。
| 常量 | 值 | 描述 |
|---|---|---|
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::SctpSocket
|
2
|
SCTP |
QAbstractSocket::UnknownSocketType
|
-1
|
除瞭 TCP、UDP 及 SCTP |
另請參閱 QAbstractSocket::socketType ().
創建新的抽象套接字為類型 socketType 。 parent 自變量會被傳遞給 QObject 的構造函數。
另請參閱 socketType (), QTcpSocket ,和 QUdpSocket .
[虛擬]
QAbstractSocket::
~QAbstractSocket
()
銷毀套接字。
中止當前連接並重置套接字。不像 disconnectFromHost (),此函數立即關閉套接字,丟棄寫緩衝中任何待決數據。
另請參閱 disconnectFromHost () 和 close ().
[override 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 ().
綁定到 address 在端口 port ,使用 BindMode mode .
對於 UDP 套接字,綁定後信號 QUdpSocket::readyRead () 發射,每當 UDP 數據報到達指定地址和端口時。因此,此函數對編寫 UDP 服務器很有用。
對於 TCP 套接字,此函數可以用於指定對外連接要使用哪個接口,在多網絡接口情況下很有用。
默認情況下,綁定套接字使用 DefaultForPlatform BindMode 。若端口未指定,選擇隨機端口。
當成功時,函數返迴
true
和套接字進入
BoundState
;否則返迴
false
.
該函數在 Qt 5.0 引入。
這是重載函數。
綁定到 QHostAddress :任何在端口 port ,使用 BindMode mode .
默認情況下,綁定套接字使用 DefaultForPlatform BindMode 。若端口未指定,選擇隨機端口。
該函數在 Qt 5.0 引入。
[override virtual]
qint64
QAbstractSocket::
bytesAvailable
() const
重實現自 QIODevice::bytesAvailable ().
返迴等待讀取的傳入字節數。
另請參閱 bytesToWrite () 和 read ().
[override virtual]
qint64
QAbstractSocket::
bytesToWrite
() const
重實現自 QIODevice::bytesToWrite ().
返迴等待寫入的字節數。寫入字節當控製迴到事件循環或當 flush () 被調用。
另請參閱 bytesAvailable () 和 flush ().
[override virtual]
bool
QAbstractSocket::
canReadLine
() const
重實現自 QIODevice::canReadLine ().
返迴
true
若可以從套接字讀取一行數據;否則返迴
false
.
另請參閱 readLine ().
[override virtual]
void
QAbstractSocket::
close
()
重實現自 QIODevice::close ().
關閉用於套接字的 I/O 設備並調用 disconnectFromHost () 以關閉套接字連接。
見 QIODevice::close () 瞭解齣現動作的描述,當關閉 I/O 設備時。
另請參閱 abort ().
[虛擬]
void
QAbstractSocket::
connectToHost
(const
QString
&
hostName
,
quint16
port
,
QIODevice::OpenMode
openMode
= ReadWrite,
QAbstractSocket::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 ().
[虛擬]
void
QAbstractSocket::
connectToHost
(const
QHostAddress
&
address
,
quint16
port
,
QIODevice::OpenMode
openMode
= ReadWrite)
這是重載函數。
試圖連接到 address 在端口 port .
[signal]
void
QAbstractSocket::
connected
()
此信號發射後於 connectToHost () 有被調用且連接已成功建立。
注意: 在某些操作係統,可以直接發射 connected() 信號從 connectToHost () 調用對於連接到本地主機。
另請參閱 connectToHost () 和 disconnected ().
[虛擬]
void
QAbstractSocket::
disconnectFromHost
()
試圖關閉套接字。若有等待寫入的待決數據, QAbstractSocket 將進入 ClosingState 並等待直到所有數據被寫入。最終,它將進入 UnconnectedState 和發射 disconnected () 信號。
另請參閱 connectToHost ().
[signal]
void
QAbstractSocket::
disconnected
()
此信號被發射當套接字斷開連接時。
警告: 若需要刪除 sender () 為此信號在連接到它的槽中,使用 deleteLater() 函數。
另請參閱 connectToHost (), disconnectFromHost (),和 abort ().
返迴最後發生的錯誤類型。
另請參閱 state () 和 errorString ().
[signal]
void
QAbstractSocket::
error
(
QAbstractSocket::SocketError
socketError
)
此信號發射,在齣現錯誤後。 socketError 參數描述齣現錯誤的類型。
當發射此信號時,套接字試圖重新連接可能還未就緒。在此情況下,試圖重新連接應該是從事件循環。例如,使用 QTimer::singleShot () 采用 0 作為超時。
QAbstractSocket::SocketError 不是注冊 Metatype (元類型),因此,對於隊列化連接而言,必須注冊它采用 Q_DECLARE_METATYPE () 和 qRegisterMetaType ().
注意: 信號 error 在此類中被重載。通過使用函數指針句法連接到此信號,Qt 提供用於獲得如此範例展示的函數指針的方便幫助程序:
connect(abstractSocket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [=](QAbstractSocket::SocketError socketError){ /* ... */ });
另請參閱 error (), errorString (),和 創建自定義 Qt 類型 .
此函數不阻塞且盡可能多地,把內部緩衝寫入到底層網絡套接字。若有寫入任何數據,此函數返迴
true
;否則 false 被返迴。
調用此函數若需要 QAbstractSocket 立即開始發送緩衝數據。成功寫入的字節數從屬操作係統。在大多數情況下,不需調用此函數,因為 QAbstractSocket 將開始自動發送數據,一旦控製迴到事件循環。若缺乏事件循環,調用 waitForBytesWritten () 代替。
另請參閱 write () 和 waitForBytesWritten ().
[signal]
void
QAbstractSocket::
hostFound
()
此信號發射後於 connectToHost () 有被調用且主機查找成功時。
注意: 從 Qt 4.6.3 起, QAbstractSocket 可以直接發射 hostFound() 從 connectToHost () 調用,由於已緩存 DNS 結果。
另請參閱 connected ().
[override virtual]
bool
QAbstractSocket::
isSequential
() const
重實現自 QIODevice::isSequential ().
返迴
true
若套接字是有效的且準備使用;否則返迴
false
.
注意: 套接字的狀態必須為 ConnectedState 在讀寫可以發生之前。
另請參閱 state ().
返迴本地套接字的主機地址 (若可用); 否則返迴 QHostAddress::Null .
這通常是主機的主 IP 地址,但也可以是 QHostAddress::LocalHost (127.0.0.1) 對於到本地主機的連接。
另請參閱 localPort (), peerAddress (),和 setLocalAddress ().
返迴本地套接字的主機端口號 (按本機字節序),若可用;否則返迴 0。
另請參閱 localAddress (), peerPort (),和 setLocalPort ().
返迴此套接字的暫停模式。
該函數在 Qt 5.0 引入。
另請參閱 setPauseMode () 和 resume ().
返迴被連接對等方的地址,若套接字處於 ConnectedState ;否則返迴 QHostAddress::Null .
另請參閱 peerName (), peerPort (), localAddress (),和 setPeerAddress ().
返迴對等方的名稱作為指定通過 connectToHost (),或空 QString if connectToHost () 沒有被調用。
另請參閱 peerAddress (), peerPort (),和 setPeerName ().
返迴被連接對等方的端口,若套接字處於 ConnectedState ;否則返迴 0。
另請參閱 peerAddress (), localPort (),和 setPeerPort ().
返迴此套接字的網絡代理。默認情況下 QNetworkProxy::DefaultProxy 被使用,意味著此套接字將查詢應用程序的默認代理設置。
該函數在 Qt 4.1 引入。
另請參閱 setProxy (), QNetworkProxy ,和 QNetworkProxyFactory .
[signal]
void
QAbstractSocket::
proxyAuthenticationRequired
(const
QNetworkProxy
&
proxy
,
QAuthenticator
*
authenticator
)
此信號可以被發射當 proxy 要求使用身份驗證。 authenticator 然後可以采用所需的詳細信息填充對象,以允許身份驗證並繼續連接。
注意: 使用 QueuedConnection 去連接到此信號是不可能的,因為連接會失敗,若身份驗證器沒有采新信息被填充,當信號返迴時。
該函數在 Qt 4.3 引入。
另請參閱 QAuthenticator and QNetworkProxy .
返迴內部讀取緩衝尺寸。這限製客戶端可以接收的數據量先於調用 read () 或 readAll ().
0 (默認) 讀取緩衝尺寸意味著緩衝沒有大小限製,確保數據不丟失。
另請參閱 setReadBufferSize () 和 read ().
[override virtual protected]
qint64
QAbstractSocket::
readData
(
char
*
data
,
qint64
maxSize
)
重實現自 QIODevice::readData ().
[override virtual protected]
qint64
QAbstractSocket::
readLineData
(
char
*
data
,
qint64
maxlen
)
重實現自 QIODevice::readLineData ().
[虛擬]
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
)
將連接的本地端端口設為 port .
可以調用此函數在子類化的 QAbstractSocket 以改變返迴值為 localPort () 函數在已建立連接後。此特徵通常用於代理連接為虛擬連接設置。
注意,此函數不綁定套接字的本地端口在連接之前 (如 QAbstractSocket::bind ()).
該函數在 Qt 4.1 引入。
另請參閱 localPort (), localAddress (), setLocalAddress (),和 setPeerPort ().
控製當收到通知時是否暫停。 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 ().
將此套接字的顯式網絡代理設為 networkProxy .
要禁用此套接字所用代理,使用 QNetworkProxy::NoProxy 代理類型:
socket->setProxy(QNetworkProxy::NoProxy);
代理的默認值為 QNetworkProxy::DefaultProxy ,意味著套接字將使用應用程序設置:若代理設置采用 QNetworkProxy::setApplicationProxy ,將使用它;否則,若工廠設置采用 QNetworkProxyFactory::setApplicationProxyFactory ,它將查詢該工廠按類型 QNetworkProxyQuery::TcpSocket .
該函數在 Qt 4.1 引入。
另請參閱 proxy (), QNetworkProxy ,和 QNetworkProxyFactory::queryProxy ().
[虛擬]
void
QAbstractSocket::
setReadBufferSize
(
qint64
size
)
設置大小為 QAbstractSocket 的內部讀取緩衝到 size 字節。
若緩衝尺寸被限製到某個大小, QAbstractSocket 不會緩衝超過此大小的數據。例外,0 緩衝尺寸意味著讀取緩衝是無限的且緩衝所有傳入數據。這是默認。
此選項是有用的,若僅在某個時間點讀取數據 (如:在實時流應用程序中),或者,若希望保護套接字,防止接收太多數據 (可能最終導緻應用程序內存不足)。
僅 QTcpSocket 使用 QAbstractSocket 的內部緩衝; QUdpSocket 根本不使用任何緩衝,而是依賴於由操作係統提供的隱式緩衝。因為這,調用此函數在 QUdpSocket 不起作用。
另請參閱 readBufferSize () 和 read ().
[虛擬]
bool
QAbstractSocket::
setSocketDescriptor
(
qintptr
socketDescriptor
,
QAbstractSocket::SocketState
socketState
= ConnectedState,
QIODevice::OpenMode
openMode
= ReadWrite)
初始化
QAbstractSocket
采用本機套接字描述符
socketDescriptor
。返迴
true
if
socketDescriptor
被接受作為有效套接字描述符;否則返迴
false
。以指定模式打開套接字通過
openMode
,並進入指定套接字狀態通過
socketState
。清零讀寫緩衝,丟棄任何待決數據。
注意: 采用同一本機套接字描述符初始化 2 個抽象套接字,是不可能的。
另請參閱 socketDescriptor ().
[protected]
void
QAbstractSocket::
setSocketError
(
QAbstractSocket::SocketError
socketError
)
將最後齣現的錯誤類型設為 socketError .
另請參閱 setSocketState () 和 setErrorString ().
[虛擬]
void
QAbstractSocket::
setSocketOption
(
QAbstractSocket::SocketOption
option
, const
QVariant
&
value
)
設置給定 option 到描述值 value .
注意: 在 Windows 運行時, QAbstractSocket::KeepAliveOption 必須在連接套接字之前設置。
該函數在 Qt 4.6 引入。
另請參閱 socketOption ().
[protected]
void
QAbstractSocket::
setSocketState
(
QAbstractSocket::SocketState
state
)
把套接字的狀態設為 state .
另請參閱 state ().
[虛擬]
qintptr
QAbstractSocket::
socketDescriptor
() const
返迴本地套接字描述符為 QAbstractSocket 對象若這是可用的;否則返迴 -1。
若套接字正使用 QNetworkProxy ,返迴的描述符可能不能用於本機套接字函數。
套接字描述符不可用當 QAbstractSocket 是在 UnconnectedState .
另請參閱 setSocketDescriptor ().
[虛擬]
QVariant
QAbstractSocket::
socketOption
(
QAbstractSocket::SocketOption
option
)
返迴值為 option 選項。
該函數在 Qt 4.6 引入。
另請參閱 setSocketOption ().
返迴套接字類型 (TCP、UDP、或其它)。
另請參閱 QTcpSocket and QUdpSocket .
返迴套接字的狀態。
另請參閱 error ().
[signal]
void
QAbstractSocket::
stateChanged
(
QAbstractSocket::SocketState
socketState
)
此信號發射,每當 QAbstractSocket 的狀態改變。 socketState 參數是新狀態。
QAbstractSocket::SocketState 不是注冊 Metatype (元類型),因此,對於隊列化連接而言,必須注冊它采用 Q_DECLARE_METATYPE () 和 qRegisterMetaType ().
另請參閱 state () 和 創建自定義 Qt 類型 .
[override virtual]
bool
QAbstractSocket::
waitForBytesWritten
(
int
msecs
= 30000)
重實現自 QIODevice::waitForBytesWritten ().
此函數阻塞,直到至少一字節被寫入套接字和 bytesWritten() 信號已被發射。函數將超時花費 msecs 毫秒;默認超時是 30000 毫秒。
函數返迴
true
若
bytesWritten
() 信號被發射;否則返迴
false
(若發生錯誤或操作超時)。
注意: 該函數在 Windows 可能隨機失敗。考慮使用事件循環和 bytesWritten () 信號若軟件會在 Windows 運行。
另請參閱 waitForReadyRead ().
[虛擬]
bool
QAbstractSocket::
waitForConnected
(
int
msecs
= 30000)
等待直到套接字被連接,最長
msecs
毫秒。若連接已建立,此函數返迴
true
;否則返迴
false
。若它返迴
false
,可以調用
error
() 以確定錯誤的原因。
以下範例最多等待 1 秒為建立連接:
socket->connectToHost("imap", 143); if (socket->waitForConnected(1000)) qDebug("Connected!");
若 msecs 為 -1,此函數不會超時。
注意: 此函數的等待時間可能稍微長於 msecs ,從屬完成主機查找所花費的時間。
注意: 多次調用此函數不纍計時間。若函數超時,連接過程將中止。
注意: 該函數在 Windows 可能隨機失敗。考慮使用事件循環和 connected () 信號若軟件會在 Windows 運行。
另請參閱 connectToHost () 和 connected ().
[虛擬]
bool
QAbstractSocket::
waitForDisconnected
(
int
msecs
= 30000)
等待直到套接字已斷開連接,最長
msecs
毫秒。若連接已斷開,此函數返迴
true
;否則返迴
false
。若它返迴
false
,可以調用
error
() 以確定錯誤的原因。
以下範例最多等待 1 秒為關閉連接:
socket->disconnectFromHost(); if (socket->state() == QAbstractSocket::UnconnectedState || socket->waitForDisconnected(1000)) qDebug("Disconnected!");
若 msecs 為 -1,此函數不會超時。
注意: 該函數在 Windows 可能隨機失敗。考慮使用事件循環和 disconnected () 信號若軟件會在 Windows 運行。
另請參閱 disconnectFromHost () 和 close ().
[override virtual]
bool
QAbstractSocket::
waitForReadyRead
(
int
msecs
= 30000)
重實現自 QIODevice::waitForReadyRead ().
此函數阻塞,直到有新數據可供讀取和 readyRead() 信號已被發射。函數將超時花費 msecs 毫秒;默認超時是 30000 毫秒。
函數返迴
true
若
readyRead
() 信號被發射且有新的數據可供讀取;否則它返迴
false
(若發生錯誤或操作超時)。
注意: 該函數在 Windows 可能隨機失敗。考慮使用事件循環和 readyRead () 信號若軟件會在 Windows 運行。
另請參閱 waitForBytesWritten ().
[override virtual protected]
qint64
QAbstractSocket::
writeData
(const
char
*
data
,
qint64
size
)
重實現自 QIODevice::writeData ().