[win] Portscanner nonblocking fehlerhaft



  • Hey,
    ich habe mir einen kleinen Portscanner mit Threads und Nonblocking winsocks programmiert.
    Wenn ich nun lokal mein Netzwerk damit nach dem offenen Port 80 prüfe erscheinen beim ersten Durchlauf die richtigen IPs. Wenn ich das Programm danach direkt nochmal laufen lasse sagt mir das Programm es würden fast alle IPs den Port 80 offen haben (obwohl die IPs vom Router nicht vergeben wurden).
    Woran kann das liegen?
    Als Threads sind bei mir fest 255 eingeschrieben.

    Weiß einer woran das liegen könnte?
    Mal kommt das richtige raus, mal aber nicht.
    Wäre super wenn einer das auch lokal testen könnte.
    Wenn er das falsche ausgibt, kann ich meistens für einige zeit nicht auf den Router übers Webinterface connecten.

    edit:
    mir fällt gerade noch was ein:
    gibt es eine schönere Lösung bezüglich des Wartens? Hab vorher immer kein sleep() in der while Schleife gehabt und das führte zu hoher CPU Auslastung.

    Code:

    #include <WinSock2.h> 
    #include <iostream>
    using namespace std;
    #include <time.h>
    
    unsigned long anzahlips=0;
    unsigned int uiPort;
    unsigned int MAXTHREADS;
    unsigned int THREADS = 0;
    int MAXTIME = 3;
    DWORD CALLBACK ScanIP(LPVOID lpParam);
    int main(int argc, char * argv[]){
    	WSADATA wsadata; WSAStartup(MAKEWORD(2,2),&wsadata);
    	char * cpStartIP=new char(20); 	char * cpEndIP=new char(20);
    	cout << "Start IP: "; cin >> cpStartIP;
    	cout << "End IP  : "; cin >> cpEndIP;
    	cout << "Port    : "; cin >> uiPort;
    	cout << "Starte Scan..." << endl; 
    
    	time_t starttime,endtime;
    
    	MAXTHREADS = 255;
    	DWORD dummy; 
    	SOCKADDR_IN CurrentIP;	
    	anzahlips++;
    	CurrentIP.sin_addr.S_un.S_addr = inet_addr(cpStartIP);
    
    	unsigned long ulEndIP = inet_addr(cpEndIP);
    
    starttime = time(NULL);
    	while(1){
    		while((MAXTHREADS - THREADS) <= 0){
    			//Warte 1sec bis Thread frei (besser für die CPU)
    			Sleep(1000);
    		}
    		THREADS++;
    		unsigned long THISIP = CurrentIP.sin_addr.S_un.S_addr;
    
    		CreateThread(NULL,0,ScanIP,(LPVOID)THISIP,0,&dummy);
    		if(CurrentIP.sin_addr.S_un.S_addr == ulEndIP)
    			break;
    
    		CurrentIP.sin_addr.S_un.S_addr = htonl(htonl(CurrentIP.sin_addr.S_un.S_addr)+1);
    		anzahlips++;
    
    	}
    	//cout << "Warte bis Threads fertig sind" << endl;
    	while(THREADS != 0){
    		//Warte bis Threads fertig
    		Sleep(1000); //Besser für CPU
    	} 
    	WSACleanup();
    	endtime = time(NULL);
    
    	cout << "Fertig !!!!" << endl;
    	cout << (double)difftime(endtime,starttime) <<endl;
    
    	system("pause");
    	return 0;
    
    }
    
    DWORD CALLBACK ScanIP(LPVOID lpParam){
    	SOCKET sock = NULL;
    	SOCKADDR_IN Info;
    	Info.sin_family = AF_INET; 
    	Info.sin_addr.S_un.S_addr = (unsigned long)lpParam;
    	Info.sin_port = htons(uiPort);
    	sock = socket(AF_INET,SOCK_STREAM,0);
    	while(sock == INVALID_SOCKET){
    		cout << "Fehler";
    		sock = socket(AF_INET,SOCK_STREAM,0);
    	}
    
    	while(sock == SOCKET_ERROR){
    		cout << "Fehler";
    		sock = socket(AF_INET,SOCK_STREAM,0);
    	}
    
    /*
    	nonblocking
    	*/
    	unsigned long iMode = 1;
    	ioctlsocket(sock,FIONBIO,&iMode);
    	if(connect(sock,(SOCKADDR*)&Info,sizeof(Info))  == SOCKET_ERROR) {
    		if( WSAGetLastError() == WSAEWOULDBLOCK)
    			{
    			fd_set Write, Err;
    			TIMEVAL Timeout;
    			FD_ZERO(&Write);
    			FD_ZERO(&Err);
    			FD_SET(sock, &Write);
    			FD_SET(sock, &Err);
    			Timeout.tv_sec = MAXTIME;
    			Timeout.tv_usec = 0;
    			if(select(0,			//ignored
    					 NULL,		//read
    					 &Write,	//Write Check
    					 &Err,		//Error Check
    					 &Timeout) == 0)
    				{
    				//cout << "Connect Timeout (" << MAXTIME << " Sec).\n";
    			}
    			else
    				{
    				if(FD_ISSET(sock, &Write))
    					{
    					//cout << "Connected!\n";
    					cout << inet_ntoa(Info.sin_addr)  << " FOUND OPEN PORT!" << endl;
    					}
    				if(FD_ISSET(sock, &Err))
    					{
    					//Ping OK aber kein open Port
    					cout << inet_ntoa(Info.sin_addr)  << " Select error.\n";
    					}
    			} //else
    		} // WSAGetLastError
    
    	} //connect
    	else
    		cout << "Port closed" << endl;
    	closesocket(sock);  
    	/*
    	BIS HIER NONBLOCKING
    	*/
    	THREADS--; 
    	return 0;
    }
    


  • -> Win-API Subforum?



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply