1

我正在尝试向 Windows Phone 7 编写远程控制应用程序。
一切正常,但我无法通过网络进行 IP 扫描。
Connected课堂上的参数Socket效果不佳。要使用它,我需要连接到任何 IP,然后发送任何消息 - 没关系。但超时时间太长 - 大约 10 秒(对于关闭的个人电脑)。
我需要扫描大约 256 个 IP,而且 2560 秒 - 太长了。我试图自己写超时。它有效,但一段时间后应用程序停止。
我不明白为什么。没有例外。电话只是停止尝试连接,视觉工作室有时会崩溃。如果有溢出 - 它会在哪里?
这是一些代码:(TryHost循环FOR运行。一次只有一个开始,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);


            }
        }

我正在使用staticSearcher。UI 按钮从StartSearch()准备类搜索的方法开始搜索,并在AsyncClient变量中运行方法。当AssyncClient请求超时或被主机应答时,AssyncClient运行AddHost()方法并Searcher准备下一个 IP,然后重新TryHost()开始

静态搜索器:

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