2017-06-21 22 views
0

サーバー側にQTcpSocket :: KeepAliveOptionを設定して、しばらくの間ネットワーク接続が失われたときに接続が自動的に切断されるようにしたいと思います。サーバー側のQTcpSocket KeepAliveOption

しかし、ドキュメントは言う:ソケットが接続される前に、Windowsランタイム、QAbstractSocket :: KeepAliveOptionで

を設定する必要があります。

クライアントでは、ソケットを作成し、オプションを設定してから接続します。

サーバー側では、ソケットは作成されず、作成され、QTcpServer :: nextPendingConnection()を購入して返されます。これらはすでに接続されています。

私は基本的に固執していますし、 "ハートビート"を自分で実装する唯一の実行可能なオプションですか?

EDIT

の着信接続ソケットにフラグを設定するためのtalamakiにより示唆されるように、私はQTcpServerサブクラスを作成しました。そして、

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 

を設定しています30000(30秒)のDWORD値

システムを再起動してシステムで使用されていることを確認してください

しかし、リモートクライアントのイーサネットケーブルを外した後も数分後に信号が切断されることはありません。

KeepAlive機能を動作させるにはどうすればいいですか?

おかげ

答えて

0

あなたができるオーバーライドQTcpServer::incomingConnectionこととフレームワークにそれを行うにさせるのではなく、QTcpSocketを自分で作成する必要があります。

0

Windowsでは、AFAIKにTCP接続のタイムアウトを制御する3つのパラメータがあります。アイドル状態の接続がキープアライブセグメントを送信し始めるまでの時間であるKeepAliveTimeを設定しました(接続はアイドル状態でなければなりません。セグメントは送信されず、Ackが受信されません)。それから、TcpMaxDataRetransmissionsであることが決まっていないと判断するために未回答の必要があるキープアライブがいくつかあります。最後に、KeepAliveIntervalであるキープアライブセグメント間の時間です。空のTCPセグメントが送信されている場合(Keep-Alives)、Wiresharkで確認してください。 Windowsの一部のバージョンでは、誤った操作が行われ、設定の一部が無視されることがあります。

関連する問題