2017-06-21 48 views
0

我想在服務器端設置QTcpSocket :: KeepAliveOption,以便在網絡連接丟失一段時間後連接會自動斷開連接。服務器端的QTcpSocket KeepAliveOption

然而,文件說:

在Windows上運行時,QAbstractSocket :: KeepAliveOption連接套接字之前必須設置。

在客戶端上,您只需創建套接字,設置選項,然後連接它。

在服務器端,您不創建套接字,它們被創建並返回,購買QTcpServer :: nextPendingConnection()。這些已經連接。

那麼我基本上堅持下去了,是我自己實施「心跳」的唯一可行方案嗎?

我已經創建了一個QTcpServer既可亞類由talamaki如建議用於設定標誌上的傳入連接插座

編輯:

class CustomTcpServer : public QTcpServer 
{ 
    Q_OBJECT 

public: 
    CustomTcpServer(QObject * parent = 0) : QTcpServer(parent) { } 

    void incomingConnection(qintptr socketDescriptor) 
    { 
     QTcpSocket *socket = new QTcpSocket(this); 
     socket->setSocketOption(QAbstractSocket::KeepAliveOption, 1); 
     socket->setSocketDescriptor(socketDescriptor); 
     addPendingConnection(socket); 
    } 
}; 

然後,我已成立

\HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\TCPIP\Parameters\KeepAliveTime 

要DWORD值爲30000(30秒)

並重新啓動系統以確保它被系統使用

但是,在拔下遠程客戶端的以太網電纜後,幾分鐘後仍然沒有斷開信號。

如何使KeepAlive功能正常工作?

感謝

回答

0

在Windows上,AFAIK有三個參數來管理TCP連接的超時。您設置了KeepAliveTime,這是直到空閒連接開始發送保持活動段的時間(連接必須空閒,沒有段發送,沒有收到Ack)。然後有一些保持活動狀態需要被回答,以確定它已經死了,這就是TcpMaxDataRetransmissions。最後,保持活動段之間的時間是KeepAliveInterval。使用Wireshark檢查是否發送了空的TCP段(它們是Keep-Alives)。某些版本的Windows也可能行爲不當,並忽略某些設置。