我做一扫描一段IP程序如下:开1000个线程扫不同的ip,做如下操作:<1>ping;<2>连接139端口;<3>取mac地址;现在做好发现在扫30万个ip时,发现内存不断被吃,扫描一个ip结束时资源并没有完全释放(可能是网络资源没有释放)谁有好的解决方法?(我在每个线程启动时创建一个clientsocket,扫描过程中代入不同的ip,在线程结束后释放 clientsocket)。
  同时我试用另一个方法:扫一个ip我起一个线程,创建clientsocket,线程结束释放clientsocket,直到起到1000个线程,这时发现有时程序被window强行关闭,但delphi没有捕捉到异常。为什么?
兄弟们有高招赶紧出手啊,分数一次只能给予100,但我可以连续发贴给分哪!!!

解决方案 »

  1.   

    这种程序还是不要用CLIENTSOCKET,用WINSOCK API吧
      

  2.   

    还有一种可能,你是不是用了非阻塞方式?CLIENTSOCKET创建时是默认为非阻塞方式的,你必须设置它为阻塞方式,否则问题大大
      

  3.   

    纯粹的WinAPI可能要好些
    或改用Indy的组件,也可以改写别的组件来适应你的需要
    1000Threads,太多了/ by LY http://www.99898.com/www/lysoft
      

  4.   

    这样试试var
      t: Linger;
    begin
      ...
      ClientSocket.Open;
      t.l_onoff := 1;
      t.l_linger := 0;
      setsockopt(ClientSocket1.Socket.SocketHandle, SOL_SOCKET, SO_LINGER, @t, sizeof(t));  // goon your code...
      ....
    end;还有你最好用是不是使用线程池来实现,还是说扫描完成后,线程也就free了最好用线程池吧减少线程的create, free的。
      

  5.   

    http://delphibbs.sumaster.com/delphibbs/dispq.asp?lid=1506217
      

  6.   

    还有,这是我写的一个线程池的实现,也许有用
    http://www.playicq.com/databack/pooler.zip