PowerShell 多线程测试IP端口

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33728708/article/details/85077723

最近在学Python的爬虫,昨天试着用多线程去使用不同的代理IP,基本原理是把所有的IP地址都放入一个队列,然后使用多线程地去读取队列里面的值。

今天突然想到,类似的方式在PowerShell里面能不能实现呢?PowerShell自己没有直接可以使用的队列模块,不过可以调用.Net里面的类来实现。

下面是一个简单的例子


$queue = [System.Collections.Queue]::Synchronized( (New-Object System.Collections.Queue) )

$lines=gc C:\temp\thebigproxylist-17-12-20.txt

foreach($line in $lines){
    $queue.enqueue($line)
}

write-host $queue.count

$Throttle = 5 #threads

#脚本块,对指定的IP测试端口,结果保存在一个对象里面

$ScriptBlock = {
   Param (
      [string]$value
   )

   $ip=$value.Split(":")[0]
   $port=$value.Split(":")[1]
   $a=test-netconnection -ComputerName $ip -Port $port

   $RunResult = New-Object PSObject -Property @{

      ComputerName=$ip
      Port=$port
      TCP=$a.TCPTestSucceeded

   }
   Return $RunResult
}

#创建一个资源池,指定多少个runspace可以同时执行

$RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, $Throttle)
$RunspacePool.Open()
$Jobs = @()

for($i=1;$i -lt 20;$i++){
    $currentvalue=$queue.Dequeue()
    Write-Host $currentvalue
    $Job = [powershell]::Create().AddScript($ScriptBlock).addargument($currentvalue)
    $Job.RunspacePool = $RunspacePool
    $Jobs += New-Object PSObject -Property @{
      Server = $currentvalue
      Pipe = $Job
      Result = $Job.BeginInvoke()
   }

}

 #循环输出等待的信息.... 直到所有的job都完成 

Write-Host "Waiting.." -NoNewline
Do {
   Write-Host "." -NoNewline
   Start-Sleep -Seconds 1
} While ( $Jobs.Result.IsCompleted -contains $false)
Write-Host "All jobs completed!"

#输出结果 
$Results = @()
ForEach ($Job in $Jobs)
{   $Results += $Job.Pipe.EndInvoke($Job.Result)
}

$Results

结果如下

Waiting................................................................................All jobs completed!

Port ComputerName TCP


80 137.74.168.174 True
8080 103.28.161.68 True
53281 91.151.106.127 False
3128 177.136.252.7 True
80 47.89.22.200 True
8888 118.69.61.57 True
8080 192.241.190.167 True
80 185.124.112.130 True
3128 83.65.246.181 True
3128 79.137.42.124 True
8080 95.0.217.32 False
8080 104.131.94.221 True
65301 177.234.7.66 True
8080 37.57.179.2 False
8080 197.211.27.234 True
8080 139.59.117.11 True
8080 168.0.158.53 False
8080 154.48.196.1 True
8080 139.59.125.53 True

成功!

展开阅读全文

多线程IP端口扫描器的实现问题

04-22

1.假如有10000条IP记录,有1024条port记录,也就是要执行10000*1024次扫描,线程若为300。最开始的300个线程用ThreadStart可以启动,但是如何能够判断某个线程完成,并在完成时再加别的任务到这个线程中(不是再创建线程,这样线程多了创建/销毁可能会消耗太多资源)从而保证工作中的线程一直是指定的线程数300?rn2.我以前做的方法是把扫描任务放在一个类SingleScan里面,每个线程实例化一个SigleScan对象,并将要此次要扫描的IP和Port及延时等参数通过构造函数传进去。线程数由MainForm中的一个public变量threadUsed来控制,当MainForm创建一个线程时threadNumUsed--,当此线程执行的ScanTask任务结束时threadNumUsed++。然后在MainForm中用for循环来添加每个扫描任务,当threadNumUsed<300时,用ThreadSleep(100)来中止一段时间,外层用while循环保证此任务添加到线程中。代码大致如下:rnClass SingleScanrnrn MainForm mainForm;rn string ip;rn string port;rn public ScanTask(MainForm _mainForm,string _ip,string _port)rn rn mainForm=_mainForm;rn ip=_ip;rn port=_port;rn rn private void SingleScan()rn rn mainForm.threadUsed--;rn ...根据ip,port,等参数进行扫描操作...rn mainForm.threadUsed++;rn rnrnClass MainFormrnrn for(int i=0;i<10000;i++)rn rn for(int j=0;j<1024;j++)rn rn bool taskAdded=false;rn while(!taskAdded)rn rn if(threadUsed<300)rn rn SingleScan singleScan=new SingleScan(this,ip[i],port[j]);rn Thread thread = new Thread(singleScan.ScanTask);rn taskAdded=true;rn rn elsern rn Thread.Sleep(100);rn rn rn rn rnrn3.用上面的方法做了之后发现有很多问题,调试发现线程都创建了,每个singleScan类实例化了,每个对象的ScanTask方法也执行了,虽然速度很快,但会把一些本来有效的给漏掉,初步估计应该不是由于线程过多造成网络阻塞引起的,可能是这种程序的设计有问题,但问题在哪不清楚。而且运行中的线程数threadUsed也是一会高一会低,不能一直保持在300,由于多线程这块比较复杂,网上找了好多实例但都没能得到理想的答案,希望高手帮忙看看这样做的局限或有没有其他更好、更高效的方法可以实现。谢谢!rnrnrnrnrn 论坛

多线程扫描指定IP端口,求助!

06-19

先前写了一个单线程的扫描端口的程序,发现扫描端口太慢,rn然后自己试着写多线程下的扫描程序,以前没写过多线程的程序,写成这样,rn哪位大侠帮我改改错,给我点意见,谢谢了!!!rn[code=C/C++]rn#include rn#include rn#include rn#pragma comment(lib,"ws2_32.lib")rnusing namespace std;rnrnint i;rnint PortEnd;rnstring IPstr;rnCRITICAL_SECTION g_sect;rnDWORD WINAPI ThreadProc1(LPVOID lpParam)rnrn while(1)rn rn EnterCriticalSection(&g_sect);//获得临界区对象所有权rn Sleep(10);rn if(i<=PortEnd)rn rn Sleep(10);rn SOCKET testsocket;rn int iopenedport = 0;rn struct sockaddr_in target_addr;rnrn cout << "正在建立socket............." << endl;rn if ((testsocket=socket (AF_INET,SOCK_STREAM,0) ) == INVALID_SOCKET)rn rn cout << "Socket建立失败!" << endl;rn exit(0);rn rn target_addr.sin_family = AF_INET;rn target_addr.sin_port = htons(i);rn target_addr.sin_addr.s_addr = inet_addr (IPstr.c_str());rn cout << "正在扫描端口:" << i << endl;rn if (connect (testsocket, (struct sockaddr *) &target_addr, sizeof(struct sockaddr)) == SOCKET_ERROR)rn cout << "端口" << i << "关闭!" << endl;rn elsern rn iopenedport++;rn cout << "端口" << i << "开放\n" << endl;rn rn i++;rn LeaveCriticalSection(&g_sect);//释放临界区对象所有权rn rn elsern rn LeaveCriticalSection(&g_sect);//释放临界区对象所有权rn break;rn rn rn return 0;rnrnDWORD WINAPI ThreadProc2(LPVOID lpParam)rnrn while(1)rn rn EnterCriticalSection(&g_sect);//获得临界区对象所有权rn Sleep(10);rn if(i<=PortEnd)rn rn Sleep(10);rn SOCKET testsocket;rn int iopenedport = 0;rn struct sockaddr_in target_addr;rnrn cout << "正在建立socket............." << endl;rn if ((testsocket=socket (AF_INET,SOCK_STREAM,0) ) == INVALID_SOCKET)rn rn cout << "Socket建立失败!" << endl;rn exit(0);rn rn target_addr.sin_family = AF_INET;rn target_addr.sin_port = htons(i);rn target_addr.sin_addr.s_addr = inet_addr (IPstr.c_str());rn cout << "正在扫描端口:" << i << endl;rn if (connect (testsocket, (struct sockaddr *) &target_addr, sizeof(struct sockaddr)) == SOCKET_ERROR)rn cout << "端口" << i << "关闭!" << endl;rn elsern rn iopenedport++;rn cout << "端口" << i << "开放\n" << endl;rn rn i++;rn LeaveCriticalSection(&g_sect);//释放临界区对象所有权rn rn elsern rn LeaveCriticalSection(&g_sect);//释放临界区对象所有权rn break;rn rn rn return 0;rnrnrnint _tmain(int argc, _TCHAR* argv[])rnrn WORD wVersionRequested;rn WSADATA wsaData;rn int err;rn wVersionRequested = MAKEWORD( 1,1 );rn err = WSAStartup( wVersionRequested, &wsaData );rn if ( err != 0 )rn rn cerr<<"WSAStartup error!"<>str;rn cout<<"Please input 开始端口: ";rn cin>>iportFrom;rn cout<<"Please input 截止端口: ";rn cin>>iportTo;rnrn i=iportFrom;rn PortEnd=iportTo;rn IPstr=str;rnrn DWORD IDThread1;rn DWORD IDThread2;rnrn HANDLE hthread1;rn HANDLE hthread2;rn hthread1=CreateThread(NULL,0,ThreadProc1,NULL,0,&IDThread1);rn hthread2=CreateThread(NULL,0,ThreadProc2,NULL,0,&IDThread2);rn CloseHandle(hthread1);rn CloseHandle(hthread2);rnrnrn cout< 论坛

没有更多推荐了,返回首页