Exemplo n.º 1
0
        private void ProcessRecv(SocketAsyncEventArgs e)
        {
            Socket sock = e.UserToken as Socket;

            if (e.SocketError == SocketError.Success && e.BytesTransferred > 0)
            {
                //add code
                bool            bOK    = true;
                UDPScanTaskInfo ti     = null;
                string          strKey = e.RemoteEndPoint.ToString();
                lock (m_dic_task_running) {
                    if (!m_dic_task_running.ContainsKey(strKey))
                    {
                        bOK = false;
                    }
                    else
                    {
                        ti           = m_dic_task_running[strKey];
                        ti.IsStarted = false;
                        m_dic_task_running.Remove(strKey);
                    }
                }
                if (bOK)
                {
                    MatchResult mr = m_configer.MatchData(e.Buffer, e.BytesTransferred, ((IPEndPoint)e.RemoteEndPoint).Port, ProbeType.Udp);
                    this.EndTask(ti, new ScanEventArgs(ti.TaskID, ti.EndPoint, mr.Name, mr.RegexLine, mr.DataString, e.Buffer, e.BytesTransferred));
                }
            }
            if (!sock.ReceiveFromAsync(e))
            {
                this.ProcessRecv(e);
            }
        }
Exemplo n.º 2
0
        public UDPScanner(int nMaxTask, ProbeConfiger probes)
        {
            m_se               = new Semaphore(nMaxTask, nMaxTask);
            m_configer         = probes;
            m_que_sae          = new Queue <SocketAsyncEventArgs>();
            m_dic_task_running = new Dictionary <string, UDPScanTaskInfo>();
            m_que_task         = new Queue <UDPScanTaskInfo>();
            for (int i = 0; i < nMaxTask; i++)
            {
                UDPScanTaskInfo ti = new UDPScanTaskInfo();
                ti.TaskID         = (uint)i + 1;
                ti.SendDatas      = new List <byte[]>();
                ti.SendDatasQueue = new Queue <byte[]>();
                m_que_task.Enqueue(ti);
            }
            m_sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            m_sock.Bind(new IPEndPoint(IPAddress.Any, 0));
            SocketAsyncEventArgs sae = new SocketAsyncEventArgs();

            sae.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed);
            sae.SetBuffer(new byte[65535], 0, 65535);
            sae.UserToken      = m_sock;
            sae.RemoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
            if (!m_sock.ReceiveFromAsync(sae))
            {
                IOProcessPool.QueueWork(this.ProcessRecv, sae);
            }
            new Thread(this.CheckTimeout)
            {
                IsBackground = true
            }.Start();
        }
Exemplo n.º 3
0
 private void EndTask(UDPScanTaskInfo ti, ScanEventArgs e)
 {
     //ti.IsStarted = false;
     if (ti != null)
     {
         ti.IsStarted = false;
         lock (m_que_task) m_que_task.Enqueue(ti);
     }
     base.OnCompleted(e);
     m_se.Release();
 }
Exemplo n.º 4
0
        private void SendData(UDPScanTaskInfo ti)
        {
            SocketAsyncEventArgs sae = this.PopSAE();

            byte[] byData = ti.SendDatasQueue.Dequeue();
            if (sae.Buffer.Length < byData.Length)
            {
                sae.SetBuffer(new byte[byData.Length], 0, byData.Length);
            }
            Array.Copy(byData, sae.Buffer, byData.Length);
            sae.SetBuffer(0, byData.Length);
            ti.LastTime        = DateTime.Now;
            sae.RemoteEndPoint = ti.EndPoint;
            if (!m_sock.SendToAsync(sae))
            {
                IOProcessPool.QueueWork(this.ProcessSend, sae);
            }
        }
Exemplo n.º 5
0
        protected override uint OnScan(int nPort, EndPoint endPoint, int nProbes, int nTimeout, int nRetry, int nTotalTimeout, bool bUseNullProbe)
        {
            lock (m_obj_sync) {
                if (base._IsDisposed)
                {
                    throw new ObjectDisposedException("UDPScanner", "The scanner was disposed");
                }
            }
            string          strError = string.Empty;
            UDPScanTaskInfo ti       = null;

            m_se.WaitOne();
            try {
                ti = this.CreateTaskInfo(nPort, endPoint, nProbes, nTimeout, nRetry, nTotalTimeout);
            } catch (InvalidOperationException ex) {
                strError = ex.Message;
            }
            string strKey = endPoint.ToString();

            lock (m_dic_task_running) {
                if (m_dic_task_running.ContainsKey(strKey))
                {
                    strError = "The task has running";
                }
                else
                {
                    m_dic_task_running.Add(strKey, ti);
                }
            }
            if (strError != string.Empty)
            {
                this.EndTask(null, new ScanEventArgs(0, endPoint, strError));
                return(0);
            }
            ti.StartTime = DateTime.Now;
            this.SendData(ti);
            //ti.IsStarted = true;
            return(ti.TaskID);
        }
Exemplo n.º 6
0
        private UDPScanTaskInfo CreateTaskInfo(int nPort, EndPoint endPoint, int nProbes, int nTimeout, int nRetry, int nTotalTimeout)
        {
            UDPScanTaskInfo ti = null;

            lock (m_obj_sync) {
                ti = m_que_task.Dequeue();
            }
            ti.Retry        = nRetry;
            ti.RunedRetry   = 0;
            ti.Port         = nPort;
            ti.EndPoint     = endPoint;
            ti.IsStarted    = false;
            ti.Timeout      = nTimeout;
            ti.TotalTimeout = nTotalTimeout;
            Queue <ProbeInfo> pi = null;

            if (nProbes < 0)
            {
                pi = m_configer.GetProbesQueue(ProbeType.Udp, nPort, 0);
            }
            else
            {
                pi = m_configer.GetProbesQueue(ProbeType.Udp, nPort, nProbes);
            }
            if (pi.Count == 0)
            {
                throw new InvalidOperationException("Can not match the probes whith port [" + nPort + "]");
            }
            ti.SendDatas.Clear();
            ti.SendDatasQueue.Clear();
            foreach (var v in pi)
            {
                ti.SendDatas.Add(v.Data);
                ti.SendDatasQueue.Enqueue(v.Data);
            }
            return(ti);
        }
Exemplo n.º 7
0
        private void ProcessSend(SocketAsyncEventArgs e)
        {
            string strKey = e.RemoteEndPoint.ToString();

            this.PushSAE(e);
            UDPScanTaskInfo ti = null;

            lock (m_dic_task_running) {
                if (!m_dic_task_running.ContainsKey(strKey))
                {
                    return;
                }
                ti = m_dic_task_running[strKey];
            }
            ti.LastTime = DateTime.Now;
            if (ti.SendDatasQueue.Count != 0)
            {
                this.SendData(ti);
            }
            else
            {
                ti.IsStarted = true;
            }
        }