说实话,你的程序糟糕的很。。建议重要写一个参考一下别人的吧你现在的问题在于:public void scan()
  {
   for(i=0;i<19;i++) //这一句i 在其它线程已经在动作,如果线程1 将i 加到了19 刚好这个线程跑到i++ 那么i就是20,当然就超出了索引你这个例子问题不少
1,各线程没有lock 保护
2,各线程没有互斥保护,使用的是同一个实例
3,严格一点 string ip = ""; int i=0; 这样付于默认值才对
4,应该使用static 变量,根据这个变量来启动相应线程并根据这个变量扫描相应的端口而不是去循环,这样很容易出现变量误会

解决方案 »

  1.   

    修改过的代码:using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Collections; 
    using System.Threading;
    class begain
    {
    public static void display()
    {
    Console.WriteLine("=========================================");
    Console.WriteLine("my first program,I think it scan ports");
    Console.WriteLine("=========================================");
    }
    }
    class scanports
    {
    static int[] ports={21,22,23,25,53,79,80,110,111,135,139,445,1080,1433,1521,3306,3389,4889,5631,8080};
    string ip;
    public scanports(string host)
    {
    ip=host;
    }
    public void Start()
    {
    ArrayList waitHandles=new ArrayList();
    for(int i=0;i<ports.Length;i++)
    {
    Scaner sc=new Scaner(this,ports[i]);
    ScanHandler sh=new ScanHandler(sc.scan);
    IAsyncResult iar=sh.BeginInvoke(new AsyncCallback(HandleScanFinish),null);
    waitHandles.Add(iar.AsyncWaitHandle);
    }
    WaitHandle.WaitAll( (WaitHandle[]) waitHandles.ToArray(typeof(WaitHandle)) );
    } private void HandleScanFinish(IAsyncResult iar)
    {
    System.Runtime.Remoting.Messaging.AsyncResult ar=(System.Runtime.Remoting.Messaging.AsyncResult)iar;
    ScanHandler sh=(ScanHandler)ar.AsyncDelegate;
    Scaner sc=(Scaner)sh.Target;

    bool res=sh.EndInvoke(iar); if(res)
    {
    Console.WriteLine( sc.port +" : OK");
    }
    } private delegate bool ScanHandler();
    private class Scaner
    {
    scanports host;
    internal int port;
    internal Scaner(scanports obj,int p)
    {
    host=obj;
    port=p;
    }
    public bool scan()
    {
    try
    {
    new TcpClient(host.ip,port);
    return true;
    }
    catch
    {
    return false;
    }
    }
    }
    }
    class mainclass
    {
    public static void Main(string[] args)
    {
    string ip=null;
    if(args.Length!=0)
    ip=args[0]; ip="127.0.0.1"; begain.display();
    if(ip==null)Console.WriteLine("usg:scanports ip"); else
    {  
    Console.WriteLine("scaning,Please wait……");
    scanports obj_scanports=new scanports(ip);
    obj_scanports.Start();
    System.Threading.Thread.Sleep(100);
    }
    }
    }