2009-05-09 7 views
21

C#2008 SP1インターネット接続をテストする最速の方法

私はこのコードを使用してクライアントWebサイトに接続しています。これは、ソフトフォンアプリケーション用です。ユーザが電話をかける前に、ソフトフォンはアクティブなインターネット接続があるかどうかをテストする必要があります。

私は、httpWebRequestクラスを使用してクライアントWebサイトに接続したかったとします。応答がOKの場合は、インターネット接続を続行できます。

しかし、私は応答が時間がかかり過ぎて応答していることに気付きました。これが非常に効率的なテスト方法ではないかどうかはわかりません。

しかし、自分のウェブサイトを閲覧すると、ページの読み込みに1秒もかかりません。しかし、私は、HttpWebRequestクラスを使用するときに時間がかかりすぎる

だから、このための要件は次のとおりです。

はいつかプロキシは、クライアントのオフィスで使用されます。 TCPClientクラスは使用できません(プロキシプロパティはありません)。

プロキシはSOCKSをサポートしていないため、Socketsクラスは使用できません。

タイムアウトプロパティを使用する必要があります。したがって、WebClientクラスは使用できません。これは、応答が返されるまでソフトフォンがフリーズするためです。数秒後にタイムアウトします。

私が考えることができる唯一のものは、HttpWebRequestクラスです。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.xxxxxxxxx.com"); 
      request.Timeout = 5000; 
      request.Credentials = CredentialCache.DefaultNetworkCredentials; 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

      if (response.StatusCode == HttpStatusCode.OK) 
      { 
       Console.WriteLine("IsSIPServerAvailable: " + response.StatusCode); 
       isAvailable = true; 
      } 

========のp \の呼び出しを使用して編集====

[DllImport("wininet.dll", CharSet = CharSet.Auto)] 
    private extern static bool InternetGetConnectedState(ref InternetConnectionState_e lpdwFlags, int dwReserved); 

[Flags] 
    enum InternetConnectionState_e : int 
    { 
     INTERNET_CONNECTION_MODEM = 0x1, 
     INTERNET_CONNECTION_LAN = 0x2, 
     INTERNET_CONNECTION_PROXY = 0x4, 
     INTERNET_RAS_INSTALLED = 0x10, 
     INTERNET_CONNECTION_OFFLINE = 0x20, 
     INTERNET_CONNECTION_CONFIGURED = 0x40 
    } 

// In function for checking internet 
InternetConnectionState_e flags = 0;   
bool isConnected = InternetGetConnectedState(ref flags, 0); 

答えて

16

InternetGetConnectedStateを呼び出すためにP /呼び出しを使用してみてください。接続が設定されているかどうかがわかります。 InternetCheckConnectionを使用して、サービスへの特定の接続をチェックしてみることができます。これは接続を直接接続するよりも(時には)速いですが、正面から完全に接続するよりも優れているかどうかをテストします。

+3

その欠点(IMO)は、コンピュータが「一般的なインターネット」に接続されているかどうかだけを伝えることです。それはあなたが後になっている特定のサービスを受けることができるかどうかをいくらか示しているだけです。それを行う最善の方法は、その非常にサービスに接続することです。もちろん、それがまだ2番目の後に有効であることを保証するものではありませんが、可能であれば、より良い指標になると思います。 (場合によっては、接続するだけで何らかの料金が発生するなど) –

+1

p/Invokeのコードを編集しました。しかし、それはLANが私のコンピュータに接続されているか(接続されているかどうか)教えてくれます。ただし、インターネットに接続しているかどうかはわかりません(インターネットを参照)。 – ant2009

+0

@robUK:InternetCheckConnectionの呼び出しを含めるために私の答えを編集しました。これは別のP/Invokeです。試してみることができます。具体的なURLが利用可能かどうかを教えてください。しかし、自分で接続するよりもやや速いと思います。 –

11

実際の通信に使用するソフトフォンは何ですか?それは同じWebサイトにHTTP/HTTPS経由ですか?もしそうなら、それは絶対に正しい方法です。次のステップは、なぜそれが長くかかるのかを理解することです。

リクエストを送信する前にネットワーク接続が確実にアップしていますか?あなたは間違いなくではなく、で事前にリクエストしていますか?あなたが応答を破棄していないことに気が付いたので私は尋ねます。もしそれが他の場所で起きたとしても、特定のサーバへの接続を2つしか与えない接続プールに対して走っていることがわかります。道徳はに常にを入れます。HttpWebResponseusingに入れます。もちろん、それはあなたの場合にはではなくであるかもしれませんが、試してみる価値があります。

実際のアプリケーションが他の場所に接続する場合は、テストでも確認する必要があります。基本的に、できるだけ本物に近づけてください。

興味深いことに、「ソフトフォン」アプリケーションだと言いますが、これは実際にはのコンパクトなフレームワークを使用した電話、またはデスクトップアプリケーションです。

+0

こんにちは。 2000、XP、Vistaで動作するデスクトップを実行します。 usingステートメントに関する情報私はそれを忘れてしまった。 SIPサーバーは同じサーバー上にあります。しかし、私はSIPプロトコルを使って接続し、RTPを使ってストリーミングすることができます。 – ant2009

+0

実際にSIPで後で接続する場合は、テスト用にSIPに接続してみませんか?いくつかのノーオペレーションSIPリクエストがありますか? –

+0

私はいくつかのSIPリクエストを調べています。私はまた、以下のP/invokeオプションが好きです。私は両方のオプションが実験されると思う。ありがとう。 – ant2009

2

Microsoft.VisualBasic.Devices名前空間を参照して、NetworkAvailableEventHandlerデリゲートとNetworkクラスを使用することができます。 Network.IsAvailableプロパティとNetwork.NetworkAvailabilityChangedイベントを使用して、ネットワークが存在するかどうか(または後で影響を受けるかどうか)を確認し、サーバーが存在するかどうかを確認するためにサーバーにHTTP GETを行います。

これは、「ネットワークが見えません」ではなく、問題を少し具体的に報告するのに役立ちます。

6

私は、クライアントへのWCF呼び出しを行うときと同様の状況がありました。クライアントが(何らかの理由で)到達できなかった場合、時間がかかりすぎます。私がしたことは、クライアントのアドレスへの生のTCPソケットを開いていた...クライアントがポート(あなたのケースのポート80)でリッスンしていない場合、これはすぐに失敗し、

これは私が到達しようとしていたエンドポイントと通信できるかどうかを判断する最も迅速で正確な答えを私に与えました。これの唯一の欠点は、送信および受信タイムアウトのオプションが接続されていないため、ソケット上で自分自身でタイムアウトを管理する必要があることです。

それは私が私が私の前に使用される実際のコードを持っていないが、これは一般的なパス上にあなたを置く必要があり、このような何か...

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

    try 
    { 
     IAsyncResult result = socket.BeginConnect("www.xxxxxxxxx.com", 80, null, null); 
     //I set it for 3 sec timeout, but if you are on an internal LAN you can probably 
     //drop that down a little because this should be instant if it is going to work 
     bool success = result.AsyncWaitHandle.WaitOne(3000, true); 

     if (!success) 
     { 
       throw new ApplicationException("Failed to connect server."); 
     } 

     // Success 
     //... 
    } 
    finally 
    { 
     //You should always close the socket! 
     socket.Close(); 
    } 

を行きます。

+0

こんにちは、コードのおかげで。実際に私はすでにソケットクラスを試しています。しかし、私が接続しなければならないプロキシサーバーは、SOCKSプロトコルをサポートしていません。プロキシサーバーでない場合は、これが最適なソリューションになります。 – ant2009

+0

申し訳ありませんが、あなたの質問でそれを逃した... –

+0

ONiel、ありがとう。私はTcpClientを使用していましたが、この方法よりはるかに低速でした。 –

1

Microsoft.VisualBasicへの参照を追加し、usingステートメントMicrosoft.VisualBasic.Deviceを追加すると、次のコード行を使用して任意のネットワークへの接続を確認できます。ホスト名はいえ、解決できない場合は

public static bool isConnectedToNetwork { 
    get { 
     Network network = new Network(); 
     return network.IsAvailable; 
    } 
} 
0

request.GetResponse()自体はあなたに例外を与えるので、あなたはその周りのtry-catchを置きたいかもしれませんが、System.Net.WebExceptionをキャッチし、でそのエラー状態をチェックしますStatusプロパティ私はどのステータスがインターネットを全く示さないか確かではない。ほとんどの応答は、DNSやその他の接続の問題が原因かもしれません。

関連する問題