你要用多线程去连接,这样单线程肯定很慢了,连接一个服务端是,特别是TCP
很慢

解决方案 »

  1.   

    几年没来CSDN看帖子了
    说一下我的办法吧,大家拍砖
    先从数据库拿到地址端口的清单,例如:
    192.168.1.4:1234
    ....
    192.168.1.5:2345
    将这些数据放入一个QUEUE里面
    用线程池TheadPool.Acc....WorkThread
    方法去从QUEUE里面取地址端口信息进行扫描
    扫描结果当然也可以使用QUEUE进行进站处理
    例如
    private static Queue<string> sQueue = new Queue<string>();
    private static void Scan()
    {
         foreach(datarow row in dt.rows)
         {
           sQueue.Enqueue(string.format("{0}:{1}",row["IP"],row["port"]);
         }
         int threadCount = 10;
         for(int i=0;i<threadCount;i++)
         {
           ThreadPool.QueueWork...(new ...Callback(ThreadScan),null);
         }
    }private static Queue<string> resultQueue = new Queue<string>();
    private static void ThreadScan(object state)
    {
       string msg = string.em;
       lock(sQueue)
       {
         if(sQueue.Count == 0)
         {
           return;
         }
         msg = sQueue.DeQueue();
       }   string[]para = ms.split(':');
       IPEndPoint rep = new IPEndPoint(Ipaddress.Parse(para[0]),int.Parse(para[1]);
       using(Socket sck = new Socket(....))
       {
         try
         {
            sck.Connect(rep);
            //do something..
            lock(resultQueue)
            {
              resultQueue.EnQueue(msg);//add remote endpoint to the queue
            }
            sck.Close();
      
       }
    }
      

  2.   

    当然那个10次循环的位置,也可以自己去创建线程
    Thead thread = new Thread(new ThreadStart(ThreadScan));这样的话,ThreadScan 方法去掉参数就好
    个人觉得用TheadPool更方便,效率可能更高,因为线程池会自动维护线程的开启与销毁
      

  3.   

    private static void ThreadScan(object state) 

      string msg = string.em; 
      lock(sQueue) 
      { 
        if(sQueue.Count == 0) 
        { 
          return; 
        } 
        msg = sQueue.DeQueue(); 
      }   string[]para = ms.split(':'); 
      IPEndPoint rep = new IPEndPoint(Ipaddress.Parse(para[0]),int.Parse(para[1]); 
      using(Socket sck = new Socket(....)) 
      { 
        try 
        { 
            sck.Connect(rep); 
            //do something.. 
            lock(resultQueue) 
            { 
              resultQueue.EnQueue(msg);//add remote endpoint to the queue 
            } 
            sck.Close(); 
      
      } 
    }
    更正如下private static void ThreadScan(object state) 

      while(true)
    {
      string msg = string.em; 
      lock(sQueue) 
      { 
        if(sQueue.Count == 0) 
        { 
          return; 
        } 
        msg = sQueue.DeQueue(); 
      }   string[]para = ms.split(':'); 
      IPEndPoint rep = new IPEndPoint(Ipaddress.Parse(para[0]),int.Parse(para[1]); 
      using(Socket sck = new Socket(....)) 
      { 
        try 
        { 
            sck.Connect(rep); 
            //do something.. 
            lock(resultQueue) 
            { 
              resultQueue.EnQueue(msg);//add remote endpoint to the queue 
            } 
            sck.Close(); 
      
      } 
    }
    }