質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.35%

【Qt】サブネットを超えたTCPの接続方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,626

score 7

Windowsアプリケーションを作成しており、Qt5.10.0にてサブネットを超えたTCP接続をしたいと思っております。

環境は以下の通りです。
・VS2015 (C++)
・Qt5.10.0

現在QTcpSocketを利用してTCPの接続を試みておりますが、
同一サブネット内であれば問題ありませんが、別サブネットに対して行うと接続に失敗しているようです。

/* 本来はクラスをオーバーライドしていますが、伝わりやすいように変数にしています */
QTcpSocket socket;

/* TCP接続 */
QHostAddress target( "192.168.100.26" );
socket.connectToHost( target, 13200 );

if( !socket.waitForConnected( 5000 ) ){
    return false; // ここでタイムアウトしてしまう
}

またLocalAddressの設定の問題を疑い、自身のローカルアドレスの設定を試してみましたが
問題は解決しませんでした。
以下がサンプルとなります。

/* 本来はクラスをオーバーライドしていますが、伝わりやすいように変数にしています */
QTcpSocket socket;

/* 自身のLocalAddress設定 */
QHostAddress pcAddress( "192.168.1.228" );
socket.setLocalAddress( pcAddress );
socket.setLocalPort( 0 );

/* TCP接続 */
QHostAddress target( "192.168.100.26" );
socket.connectToHost( target, 13200 );

if( !socket.waitForConnected( 5000 ) ){
    return false; // ここでタイムアウトしてしまう
}

補足としては、コマンドプロンプトでのPingにて、応答があること自体は確認できておりますので、
物理的な問題は無いかとは思っております。
(ルーターも合わせて設定済みの環境です)

何かQtの足りない設定や、使用方法等に問題がありますでしょうか?
ご回答宜しくお願いいたします。

【補足】
ネットワーク構成および、こちらでの確認済み内容について補足させて頂きます。

環境:
・Windows10
・オンボードとUSBを含めて、複数のネットワークカードが利用可能な状態
・1つのネットワーク設定を固定IP Addressとして、以下のように接続
[PC(192.168.1.228) == (192.168.1.1) Router (192.168.100.1) == (192.168.100.26)]

状況:
・送信元(192.168.1.228)が指定できるようなTCP接続確認ツールでは接続できている。
・接続確認にはWireSharkも利用し、パケットの送受信も確認できている。
・一応[ipconfig 192.168.100.26 -S 192.168.1.228]でも応答は確認できている。
・Qtでも同様の事をしたく、TCP Socketクラスを利用してみるも上手く繋がらない。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yakota

    2018/02/15 11:36

    「パケットが出て失敗してる場合とパケットも出さずに失敗してる場合」は[SYN,ACK]が出ているかの確認でよろしいでしょうか?[SYN,ACK]であれば確認した所出ていないようです。ちなみに成功するツールでは出ている事が確認できています。。

    キャンセル

  • a_saitoh

    2018/02/15 11:47

    最初に出るパケットはSynです。それにSYNACKが帰ってきて、ACKを送って接続完了。最初のSYNパケットも出てないのでしょうか?QTは何か情報量のあるエラーメッセージは出してないのですか?

    キャンセル

  • yakota

    2018/02/15 11:58

    「最初に出るパケットはSynです」申し訳ありません、おっしゃる通りで省略して記述してしまいました。エラーメッセージに関してはQTcpSocketのlast errorで確認すると「The socket operation timed out.」のみでその他の情報が取れていない状況です。

    キャンセル

回答 2

checkベストアンサー

+1

setLocalAddressを呼んでも、bindをしませんので、明示的にローカルアドレスをbindする必要があるのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/15 19:13

    ご回答有り難うございます。
    ご指摘の通りでした。
    AssistantのNoteの部分を理解できておりませんでした

    setLocalAddressをやめてbind関数にする事で無事完了いたしました。

    キャンセル

0

まず最初にお断りしますが私はQtに詳しいわけではありません。ネットワークに関する一般論で回答させていただきます。したがいまして、本回答のほかに、Qtライブラリに未知の仕様がある可能性があります。

pingが通じ合っているのであればこれはIPレベル(L3レベル)での疎通に問題はありません。したがって、サブネットが異なるか同一であるかが直接影響を与えるとは考えにくいです。

私であれば、「NW構成における中継器(この場合はルータ、Windows標準FW)において別件の課題があるのではないか」と考えます。たとえばFW設定で当該ポートを遮断しているとかを考えます(例外的に「同一サブネットからのみ許可」とも考えられます)。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/15 09:39

    ご回答頂き感謝いたします。

    ポートに関してですが、Qtでのアプリとツールでは同一のポート番号にてテストしております。
    これで結果が異なる事から、中継器の問題は省いた所ではありました。
    もう一度ルーターの設定を見てみようと思います。

    またWindows標準FWに関しては確かに考えておりませんでしたが、
    アプリ単位の設定として何か必要な物があるのでしょうか?
    これまでTCP接続ではあまり意識していなかったので、サブネットを超える場合に必要なFWの設定や注意点は考えた事がありませんでしたので少し調べてみようかと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る