我嘗試使用QTcpSserver
,這將與保持連接,並且一次只有一個客戶端,直到客戶端斷開連接。所以,我在客戶端留下了一個成員指針。我可以在deleteLater之後再次使用QTcpSocket進行另一個連接嗎?
問題出現在這裏:在我看到的互聯網上的例子中,在disconnected()
之後,它被稱爲deleteLater()
。很好,但我會再次使用這個類成員指針來進行另一個連接。請記住,服務器一次只保留一個客戶端。那麼,如果在分配了另一個連接之後套接字對象被刪除呢?
我的意思是:
class TcpServer(QObject* o) : public QTcpServer {
...
private:
QTcpSocket* client;
}
void TcpServer::connected() {
client = this->nextPendingConnection();
this->pauseAccepting();
connect(client, SIGNAL(disconnected()), client, SLOT(clientDisconnected()));
}
void TcpServer::clientDisconnected() {
client->deleteLater();
this->resumeAccepting();
}
的情況是這樣的:
客戶端連接。因此,
client = nextPendingConnection();
服務器已暫停收聽。不接受新的連接。
客戶端斷開連接。需要發佈
client
。因此,client->deleteLater()
被調用。服務器繼續收聽。
新的連接來。所以,我需要
client = nextPendingConnection();
但,以前client
對象被刪除了?也許?也許不會?如果事件循環嘗試刪除client
,在步驟5中將新連接分配給它之後該怎麼辦?
那麼,我將如何保持一個且只有一個客戶端,同時刪除以前斷開連接的客戶端?
如果我這樣做會安全嗎?
void TcpServer::clientDisconnected()
{
QSocket* ptr = client;
ptr->deleteLater();
...
}
根據您的場景,我認爲您應該有一個tcp套接字池,您可以創建和刪除,而不必擔心前一個套接字是否已成功刪除。如果你真的只想使用一個套接字,你應該聽「destroy()」信號,然後調用resumeAccepting() –
「銷燬:這個信號在對象obj被銷燬之前立即發出,並且不能被阻塞。 「這意味着任何我會在這個信號槽內寫入的東西,都會在對象被銷燬後被調用,對吧?所以,這似乎是問題的答案。如果你寫了,我會接受。 –