program pscan; {$APPTYPE CONSOLE} uses Winsock, Windows; const MaxThreads = 1000; var MaxPort, Flag, ScanPort, ThreadCounts: Integer; WSAData: TWSAData; Server: string; TID: Cardinal; procedure ThreadFunction(AArgs:Pointer); var Sock: TSocket; HostAddr: TSockAddrIn; begin if ScanPort >= MaxPort then Exit; Inc(ScanPort); HostAddr.sin_port := htons(ScanPort); HostAddr.sin_family := AF_INET; HostAddr.sin_addr.S_addr := inet_addr(Pchar(Server)); Sock := Socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if connect(Sock, HostAddr, SizeOf(HostAddr)) <> SOCKET_ERROR then Writeln(#10, 'port ', ntohs(HostAddr.sin_port), ' open..'); closesocket(Sock); Dec(ThreadCounts); end; begin WSAStartup($101, WSAData); if ParamCount > 2 then begin Server := ParamStr(1); Val(ParamStr(2), ScanPort, Flag); if Flag <> 0 then ScanPort := 1; Val(ParamStr(3), MaxPort, Flag); if Flag <> 0 then maxport := 100; end else begin WriteLn('usage: pscan IP minport maxport'); Exit; end; ThreadCounts := 0; repeat if ThreadCounts < MaxThreads then begin write(#13, 'Pocet vlaken: ', ThreadCounts); Inc(ThreadCounts, Ord(CreateThread(nil, 0, @ThreadFunction, nil, 0, TID) <> 0)); Sleep(20); end else WaitForSingleObject(GetCurrentProcess, 500); until ScanPort >= MaxPort; WSACleanup; end.