2

QTcpSocket を使用してピアに接続しようとする Linux Qt5/c++ アプリを作成しています。電話する

tcpsocket->connectToHost(address,port,options)

ピアが利用可能になると、うまく機能し、すぐに接続されます。ただし、ピアが使用できない場合: 上記を初めて呼び出すと、接続は SocketTimeoutError (5) を受け取る前に 1 分間待機します。その後、接続への後続のすべての呼び出しは、ConnectionRefusedError (0) を受け取る前に 1 秒待機するか、1 分間待機する可能性があります (テストされたシステムによって異なります)。

初期接続の待機時間を短縮するために使用できる setsockopt はありますか?

接続が失われたことをすぐに通知するために、いくつかのソケット オプションを既に設定していることを指摘しておく必要があります (以下を参照)。これらが 1 分間の初期接続エラーの遅延を引き起こしていないことを願っています。

int enableKeepAlive = 1;
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &enableKeepAlive, sizeof(enableKeepAlive));
int maxIdle = 5; /* seconds */
setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &maxIdle, sizeof(maxIdle));
int count = 3;  // send up to 3 keepalive packets out, then disconnect if no response
setsockopt(fd, SOL_TCP, TCP_KEEPCNT, &count, sizeof(count));
int interval = 2;   // send a keepalive packet out every 2 seconds (after the 5 second idle period)
setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &interval, sizeof(interval));
4

1 に答える 1

0

に依存するsetsockopt()のではなく、代わりにソケットを非ブロック モードに設定して非同期を実行してみませんかconnect()select()次に、 、または使用しているイベント逆多重化メカニズムをブロックし、poll()タイムアウトを任意に設定します。書き込み可能になると、接続が完了したことがわかります。

于 2014-09-19T16:49:43.637 に答える