質問編集履歴

1 ソースを見やすくするために編集しました

tachoawc3148

tachoawc3148 score 12

2016/05/26 16:30  投稿

非同期ソケットでのタイムアウト判定
unity C# での質問です  
 
サーバにTCP/IPで接続する際に同期接続を行った場合、サーバ側が落ちていた時に接続失敗になるまで時間がかかるので、非同期接続でタイムアウトを取りたいのですがうまく行きません。
ネットでの記事を参考にこんなソースを書いて、このクラスでチェックし、応答が取れたら同期接続をするというロジックでやっています。
このロジックですと、サーバ側PCもクライアントとなるスマホも同じローカルネットワークならうまくいくのですが、スマホが公衆回線の場合はサーバを落としていても iar.IsCompleted が true になって、つながったと判断してしまいます。
良い方法、あるいは、根本的にアプローチが間違えている、など、ご指導頂けましたら幸いです。
よろしくお願いします。
 
```C#  
using UnityEngine;
using System;
using System.Collections;
using System.Net.Sockets;
public class TCPcheck : MonoBehaviour
{
   // 接続OK
   public bool blConnectFlg = false;
   // TCPクラス
   private TcpClient tc = null;
   // TCP/IP 接続チェック (非同期)
   public IEnumerator Connect(string host, int portNo, int timeoutMSec)
   {
       // 接続OKフラグ
       blConnectFlg = false;
       // TCPクラス定義
       TcpClient tc = new TcpClient();
       // 開始時刻 確保
       float startTime = Time.time;    // 開始時間
       // 接続
       IAsyncResult iar = tc.BeginConnect(host, portNo, null, null);
       // 接続終了待ち
       while (iar.IsCompleted == false && (Time.time - startTime) < 10 )
       {
           yield return 0;
       }
       // 接続できた場合
       if (iar.IsCompleted == true)
       {
           // 接続フラグを立てる
           blConnectFlg = true;
           // 終了
           tc.Close();
       }
       // 破棄
       iar = null;
       // 終了
       yield break;
   }
}
}
```
  • C#

    9274 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    5683 questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る