1

Windows Phone 7 用のリモート コントロール アプリケーションを作成しようとしています
。クラスの
Connectedparam がうまく機能しません。Socketそれを使用するには、任意の IP に接続してから任意のメッセージを送信する必要があります。問題ありません。しかし、タイムアウトが長すぎます - 約 10 秒 (オフになっている PC の場合)。
約 256 の IP をスキャンする必要があり、2560 秒は長すぎます。自分でタイムアウトを書いてみました。動作しますが、しばらくするとアプリケーションが停止します。
理由がわかりません。例外なく。電話は接続の試行を停止するだけで、Visual Studio がクラッシュすることがあります。オーバーフローがある場合 - どこにある可能性がありますか?
ここにいくつかのコードがあります: (TryHostFORサイクルで実行されます。一度に 1 つのみ開始し、 のSearcher.AddHost()次の反復を実行しますTryHost)

非同期クライアント:

  public void TryHost(string host)
            {

                SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                DnsEndPoint hostEntry = new DnsEndPoint(host, _port);

                // Create a socket and connect to the server 

                Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(SocketEventArg_Completed1); 
                socketEventArg.RemoteEndPoint = hostEntry;
                sock.NoDelay = true;
                socketEventArg.UserToken = sock;
                try
                {
                    sock.ConnectAsync(socketEventArg);
                }
                catch (SocketException ex)
                {}

            }



    void SocketEventArg_Completed1(object sender, SocketAsyncEventArgs e)
            {

                switch (e.LastOperation)
                {
                    case SocketAsyncOperation.Connect:
                        ProcessConnect1(e);
                        break;
                    case SocketAsyncOperation.SendTo:
                        connected = false;
                        ProcessSend1(e);
                        break;
                    case SocketAsyncOperation.Receive:
                        sended = false;
                        ProcessReceive1(e);
                        break;
                    default:
                        throw new Exception("Problems");

                }
            }
 private void ProcessReceive1(SocketAsyncEventArgs e)
        {

            if (e.SocketError == SocketError.Success)
            {

                // Received data from server 

                string dataFromServer = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred);
                if (dataFromServer.IndexOf("<EOF>") > -1)
                {

                    Searcher.AddHost(dataFromServer);

                }



            }
            else
            {
                Searcher.AddHost(null);

            }
        }

        private void ProcessSend1(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {



                Socket sock = e.UserToken as Socket;
                sended = true;               
                sock.ReceiveAsync(e);                
                Thread.Sleep(500);
                if (sended)
                {
                    sock.Dispose();
                    Searcher.AddHost(null);

                }
            }
            else
            {

                Searcher.AddHost(null);
            }
        }

        private void ProcessConnect1(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                byte[] buffer = Encoding.UTF8.GetBytes("Knock" + "!" + sessionId + "<EOF>");
                  e.SetBuffer(buffer, 0, buffer.Length);
                  sock = e.UserToken as Socket;
                  connected = true;
                  sock.SendToAsync(e);
                  e.ConnectSocket.NoDelay = false;
                  Thread.Sleep(500);
                  if (connected)
                  {
                      sock.Dispose();
                  }
            }
            else
            {
                sock.Dispose();
                Searcher.AddHost(null);


            }
        }

staticクラスを使用してSearcherいます。UI ボタン​​は、検索StartSearch()するクラスを準備するメソッドから検索を開始し、 AsyncClient変数でメソッドを実行します。AssyncClientリクエストがタイムアウトまたはホストからの応答があった場合、メソッドをAssyncClient実行して次の IP を準備し、再度開始しますAddHost()SearcherTryHost()

静的サーチャー:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;
using System.Threading;    


namespace PivotApp1 {

 class PartedIp
 {
     public string FirstPart;
     public string LastPart;
     public PartedIp(string first, string last)
     {
         FirstPart = first;
         LastPart = last;
     }
 }
 public class SearchArgs : EventArgs
 {

     private List<string> message;

     public SearchArgs(List<string> msg)
     {

         message = msg;
     }


     public List<string> Message
     {
         get { return message; }
     }
 }
 public static class Searcher
 {
     static bool searching = false;
     static string phoneIp = "";
     static string ipTemplate = "";
     static int currentLookingIp;
     static int stopIp;
     static List<string> answers = new List<string>();
     static AsynchronousClient newC;
     static int chBound = 255;
     static int lwBound = 255;

     public static event EventHandler SearchComplete = delegate { };
     public static void SayItsOver(List<string> message)
     {
         SearchComplete(null, new SearchArgs(message));
     }
     static AsynchronousClient searcher;
     static string CheckIp()
     {
         string phoneIp = null;
         try
         {
             MyIPAddress finder = new MyIPAddress();
             finder.Find((address) =>
             {

                 phoneIp = address == null ? "Unknown" : address.ToString();

             });
         }
         catch (Exception e)
         {
             throw new Exception();
         }
         if (phoneIp == "Unknown")
         {
             return null;
         }
         else
         {
             return phoneIp;
         }
     }
     static PartedIp PrepareForSearch(string phoneIp)
     {
         IPAddress ipForTest = new IPAddress(10);
         if (IPAddress.TryParse(phoneIp, out ipForTest))
         {

             string[] splittedIp = phoneIp.Split('.');
             PartedIp phonePartedIp = new PartedIp(splittedIp[0] + '.' + splittedIp[1] + '.' + splittedIp[2] + '.', splittedIp[3]);
             return phonePartedIp;
         }
         else return null;
     }
     public static void StartSearch(AsynchronousClient newC)
     {

         phoneIp = CheckIp();
         if (phoneIp != null)
         {
             searching = true;
             newC = newC1;

             PartedIp partedIp = PrepareForSearch(phoneIp);
             ipTemplate = partedIp.FirstPart;
             stopIp = Int32.Parse(partedIp.LastPart);

             currentLookingIp = stopIp - 1;

             newC.TryHost(ipTemplate + currentLookingIp);
         }
         else
             Deployment.Current.Dispatcher.BeginInvoke(() => {
                MessageBox.Show("Error in Ip detection");

              });
     }

     static void NextHost()
     {
         if (searching)
         {
             currentLookingIp--;
             if (currentLookingIp == 0)
                 currentLookingIp = 255;
         }
     }

     static public void AddHost(string answer)
     {
         if (searching)
         {
             if (answer != null)
             {
                 answers.Add(answer);
             }


             NextHost();
             if (currentLookingIp == stopIp)
             {
                 SayItsOver(answers);
                 searching = false;
             }
             else
             {

                 newC.TryHost(ipTemplate + currentLookingIp);
             }
         }

     }
 } }

私はこれを何度もデバッグしました。私のスタートip = 192.168.0.103My Server Ip = 192.168.0.100. 192.168.0.19(ここに PC がない)まで、検索は完全に機能しています。そこから検索を開始して192.168.0.20もクラッシュしました。別のデッド ゾーンis 192.168.0.1と次の192.168.0.255. また、手動での起動は正常にTryHost()機能します。検索を自動化しようとすると問題が発生します。どうしたの?
私はそれに数日を費やしましたが、何をすべきかわかりません。

4

0 に答える 0