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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1355閲覧

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

yakota

総合スコア7

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

2クリップ

投稿2018/02/02 05:55

編集2018/02/05 01:36

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クラスを利用してみるも上手く繋がらない。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yakota

2018/02/02 07:19

ご回答ありがとうございます。ご指定頂いたツールでは接続に失敗しているようです。ただ送信元のIP Addressが指定できるようなツールの場合は成功します。成功している場合、パケットの送受信にも問題ないようですので、Qtの使用方法に問題があるかと思い質問させて頂きました。
iwanote

2018/02/04 04:28

ネットワーク構成はどのようになっていますか?
yakota

2018/02/05 00:09

[PC(192.168.1.228) == (192.168.1.1) Router (192.168.100.1) == (192.168.100.26)]という比較的シンプルな構成です。PCが複数のネットワークカードを搭載しており、送信元(192.168.1.228)のIPアドレスが指定可能なツールでのパケット送受信の確認(WireSharkにて確認)は問題ありませんでした。またコマンドプロンプトでの[ipconfig 192.168.100.26 -S 192.168.2.228]でも応答が確認できております。
a_saitoh

2018/02/14 14:24

wiresharkなどでQtからのパケットが出てるかどうか、そのパケットの宛先/送信元アドレスがどうなってるか、を調べたらどうでしょう。同時に相手ホスト側でもパケットダンプしてみる。送れてない、ネットで落ちてる、届いてるが返事してない、返事はでてるが届いてない、などの区別がつきます。
yakota

2018/02/15 00:04

ご返信有り難うございます。上記の回答でも記述させて頂きましたが、接続可能なツールではWireSharkにて送受信の確認が取れている状態です。Qtのライブラリを使用した場合TCPのConnectionで失敗する為、WireShark以前の問題となってしまっております。
a_saitoh

2018/02/15 02:03

「Connectionで失敗する」といってもパケットが出て失敗してる場合とパケットも出さずに失敗してる場合がありますよ。どちらの失敗なのか調べましたか?
yakota

2018/02/15 02:36

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

2018/02/15 02:47

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

2018/02/15 02:58

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

回答2

0

ベストアンサー

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

投稿2018/02/15 06:57

Harahira

総合スコア243

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yakota

2018/02/15 10:13

ご回答有り難うございます。 ご指摘の通りでした。 AssistantのNoteの部分を理解できておりませんでした setLocalAddressをやめてbind関数にする事で無事完了いたしました。
guest

0

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

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

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

投稿2018/02/14 16:55

編集2018/02/14 16:55
HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yakota

2018/02/15 00:39

ご回答頂き感謝いたします。 ポートに関してですが、Qtでのアプリとツールでは同一のポート番号にてテストしております。 これで結果が異なる事から、中継器の問題は省いた所ではありました。 もう一度ルーターの設定を見てみようと思います。 またWindows標準FWに関しては確かに考えておりませんでしたが、 アプリ単位の設定として何か必要な物があるのでしょうか? これまでTCP接続ではあまり意識していなかったので、サブネットを超える場合に必要なFWの設定や注意点は考えた事がありませんでしたので少し調べてみようかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問