1

重複の可能性:
15 秒後にコードの実行を停止する

私はパケット スニファーのコードを扱っており、それにいくつかの変更を加えたいだけです。プログラムを起動すると、パケットを 15 秒間だけキャプチャするように編集しようとしています。以下は、パケットをインターセプトするコードの一部です。ご覧のとおり、Try/Catch/Throw を扱っており、ループのように動作します。

        public void Start() {
            if (m_Monitor == null)
            {

                try
                {

                    m_Monitor = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
                    m_Monitor.Bind(new IPEndPoint(IP, 0));
                    m_Monitor.IOControl(SIO_RCVALL, BitConverter.GetBytes((int)1), null);
                    m_Monitor.BeginReceive(m_Buffer, 0, m_Buffer.Length, SocketFlags.None, new AsyncCallback(this.OnReceive), null);
                }
                catch
                {
                    m_Monitor = null;
                    throw new SocketException();
                }
            }
    }
    /// <summary>
    /// Stops listening on the specified interface.
    /// </summary>
    public void Stop() {
        if (m_Monitor != null) {
            m_Monitor.Close();
            m_Monitor = null;
        }
    }
    /// <summary>
    /// Called when the socket intercepts an IP packet.
    /// </summary>
    /// <param name="ar">The asynchronous result.</param>
    /// 
    private void OnReceive(IAsyncResult ar) {
            try
            {
                int received = m_Monitor.EndReceive(ar);
                try
                {
                    if (m_Monitor != null)
                    {
                        byte[] packet = new byte[received];
                        Array.Copy(Buffer, 0, packet, 0, received);
                        OnNewPacket(new Packet(packet));
                    }
                }
                catch { } // invalid packet; ignore
                m_Monitor.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(this.OnReceive), null);
            }
            catch
            {
                Stop();
            }
    }

たとえば、このコードを変更して、たとえば 15 秒後に開始すると停止するようにするにはどうすればよいと思いますか? DateTime を使用しようとしましたが、成功せず、このいわゆるループを破ることができませんでした。

4

3 に答える 3

0

私はあなたが時間を測定し、特定の時間が「15秒」と言った後にコードを停止する必要があると思います、StopWatchクラスはあなたを助けることができます。

// Create new stopwatch instance
Stopwatch stopwatch = new Stopwatch();
// start stopwatch
stopwatch.Start();
// Stop the stopwatch
stopwatch.Stop();
// Write result
Console.WriteLine("Time elapsed: {0}",stopwatch.Elapsed);
// you can check for Elapsed property when its greater than 15 seconds 
//then stop the code

Elapsedプロパティは、次のようなTimeSpanインスタンスを返します。

TimeSpan timeGone = stopwatch.Elapsed;

あなたのシナリオに合うように、あなたはこのようなことをすることができます

Stopwatch stopwatch = new Stopwatch();
TimeSpan timeGone;
// Use TimeSpan constructor to specify:
// ... Days, hours, minutes, seconds, milliseconds.
// ... The TimeSpan returned has those values.
TimeSpan RequiredTimeLine = new TimeSpan(0, 0, 0, 15, 0);//set to 15 sec

While ( timeGone.Seconds < RequiredTimeLine.Seconds )
{
    stopwatch.Start();
    Start();
    timeGone = stopwatch.Elapsed;
}
Stop();//your method which will stop listening

いくつかの便利なリンク
MSDNStopWatch

注:
私は、これらの基本的なアプローチを通じて誰もが彼の問題を分類できるように十分な指針を与えたと確信しています。また、別のアプローチについて私のコメントを確認してください。

于 2012-11-04T16:29:25.940 に答える
0

あなたが使うことができます

System.Threading.Thread.Sleep(15000);

その後にコードを置きます。コードは、定義された遅延の後に実行されます。

幸運を

于 2012-11-04T16:30:30.167 に答える
0

コードが別のスレッドを使用して実際の作業を行う場合、次のかなり少量のコードでセットアップできます。

using System;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static YourSnifferClass sniffer = new YourSnifferClass();
        static AutoResetEvent done_event = new AutoResetEvent(false);

        static void Main(string[] args)
        {           
            sniffer.Start();

            // Wait for 15 seconds or until the handle is set (if you had a
            // Stopped event on your sniffer, you could set this wait handle
            // there: done_event.Set()
            done_event.WaitOne(TimeSpan.FromSeconds(15));

            // stop the sniffer
            sniffer.Stop();
        }
    }
}

それが役立つことを願っています。

于 2012-11-04T17:04:40.560 に答える