none
StreamSocketクラスでの接続状態の確認について RRS feed

  • 質問

  • Windows10のUWPアプリでWindows.Networking.Sockets.StreamSocketクラスを用いて接続型のサーバとの送受信を行っています。

    ConnectAsync()後にネットワークが切断されたことを検知したいのですが、StreamSocketクラスのインスタンスから検知する方法はないでしょうか?

    ReadAsync()やWriteAsync()などを行えば例外がThrowされるのは分かるのですが、それ以外の方法で検知する仕組みがないかと思っています。

    2018年3月1日 7:07

すべての返信

  • APIリファレンスマニュアルを参照してください。

    https://docs.microsoft.com/ja-jp/uwp/api/windows.networking.sockets.streamsocket

    そこに記載されていなければ無いと思います。

    それから、Exceptionでの処理以外で行いたい理由(意図)などを記載しないと、良い回答は得られないかもしれませんよ。

    2018年3月3日 12:33
  • 相手側から明示的に切断したことを通知されない限り、これは取得できません。

    自ネットワーク装置での検知は「NetworkInformation」APIを使用して別方向から検知という手もありますが、これはネットワークそのものの状況確認用なので、今回の件には役に立たないと思います。

    例外を捕まえて、メッセージ内容を判断して処理を行うようにしてください。

    2018年3月4日 1:01
  • 返信とアドバイスありがとうございます。

    Exception以外で判断したい理由としては、一度送受信を行った後に再び送受信を行うまでにある入力装置からの入力を必要があり、その間にネットワーク切断が発生した場合にエラー系の画面に遷移する要件があるためです。

    2018年3月5日 2:25
  • 返信ありがとうございます。

    StreamSocketクラスでは検知は無理そうなため、タスク内でReadAsyncを行いException発生時にHRESULTを見て判断しようと思っています。

    アドバイスありがとうございました。

    2018年3月5日 2:27
  • 障害などによる切断検知を行いたい場合は、Exception発生での処理が妥当です。(毎回検知させようとすると冗長的な条件判定が増えるのみで効率の悪い処理になるため)

    より厳密なシーケンスを求める場合は、独自プロトコルを作成しメッセージシーケンスで通信を行うほうが良いです。サーバー側からのDisconnect通知または要求が有ればクライアントでその旨の処理を行う。それ以外の切断は、例外発生として処理を行う。

    通常はこのような通信処理になると思います。

    2018年3月5日 8:20
  • 返信ありがとうございます。

    ReadAsyncやWriteAsyncでのException発生で切断を判定するようにしようと思います。

    アドバイスありがとうございました。

    2018年3月6日 4:18
  • oooomura さん、こんにちは。フォーラム オペレーターの立花です。
    MSDN フォーラムへご投稿くださいましてありがとうございます。

    フォーラムオペレーターからのお願いです。

    皆様からのご返信内容はお役に立ちそうでしょうか。
    もし、参考となる返信がありましたら、同じ問題でお困りの方のためにも、
    該当の返信に [回答としてマーク] をご設定くださいませ。

    ご協力のほど、どうかよろしくお願いいたします。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年3月6日 4:59
    モデレータ