Unter Windows für MIKRO-Sekunden warten?
-
big juli schrieb:
void wait (int mikroseconds )
{
clock_t endwait;
endwait = clock() + mikroseconds *CLK_TCK ;
while (clock() > endwait) {}
}Die Funktion nimmt "Sekunden" entgegen, aber keine Mikro-Sekunden! und der Vergleich ist auch noch falsch ">" anstelle von "<"...
-
net schrieb:
vielleicht hilft auch 'NtDelayExecution'.
Ist aber undokumentiert...
http://undocumented.ntinternals.net/UserMode/Undocumented Functions/NT Objects/Thread/NtDelayExecution.htmlDas beste ist immer noch eine vernünftige Synchronisation:
http://msdn.microsoft.com/library/en-us/dllproc/base/using_synchronization.aspEine Wartefunktion könnte so aussehen:
LARGE_INTEGER s_liFreq = {0}; void wait (int mikroseconds ) { if (s_liFreq.QuadPart == 0) QueryPerformanceFrequency(&s_liFreq); LARGE_INTEGER liStart; LARGE_INTEGER liGoal; QueryPerformanceCounter(&liStart); liGoal.QuadPart = liStart.QuadPart; liGoal.QuadPart += (s_liFreq.QuadPart * mikroseconds) / 1000000; LARGE_INTEGER liAct; do { QueryPerformanceCounter(&liAct); if (liStart.QuadPart > liAct.QuadPart) break; // overflow!!! } while(liAct.QuadPart < liGoal.QuadPart); }
Aber ACHTUNG:
- Es kann keine Garantie übernommen werden, dass nicht doch länger gewartet wird als man angibt; dies hängt u.a. damit zusammen, dass es teilweise einen Switch in der Kernel-Mode gibt...
-
Wie gesagt, wenn Variablen falsch zugeordnet werden würde ich überhaupt ein anderes Design vorschlagen. Lass lieber mal deinen Code sehen und wir retten dich vor dem totalen Untergang auf schnelleren Prozessoren.
MfG SideWinder
-
also hier ist der code, es ist ein kleiner portscanner
wenn ihr was net versteht(is öfter bei meinen codes :D) dann meldet euch
danke
lg papanoah/* Name: Portscanner Copyright: - Author: papa Date: 28.12.05 12:23 Description: Simpler Portscanner */ #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <winsock2.h> char ip[30]; int anfangsport, endport, threads, threadscount=0, anzahl, count=0, prozent; //Funktion zum Scannen (Jede Menge Fach-Jagon) void scan (void *dummy) { int funktionport; long rc; SOCKET s; SOCKADDR_IN addr; WSADATA wsa; //socket erstellen funktionport = anfangsport; rc=WSAStartup(MAKEWORD(2,0),&wsa); //socket erstellen s=socket(AF_INET,SOCK_STREAM,0); //client socket erstellen memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family=AF_INET; addr.sin_port=htons(funktionport); //port addr.sin_addr.s_addr=inet_addr(ip); //zielrechner rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); //Offene Ports ausgeben if(rc != SOCKET_ERROR) { printf ("Port %i ist offen.\n", funktionport); } //Socket schliessen closesocket(s); WSACleanup(); threadscount--; _endthread(); } int main(int argc, char *argv[]) { //ip eingeben printf ("Geben Sie die zu scannende IP ein: "); gets (ip); if (strlen(ip) > 15 || strlen(ip) < 7) { printf ("Unbekanntes IP Format.\n\n"); system("PAUSE"); exit(0); } //anfangsport eingeben printf ("\nGeben Sie den Anfangs-Port ein: "); scanf ("%i", &anfangsport); if (anfangsport > 65535 || anfangsport < 1) { printf ("Unbekannter Port.\n\n"); system("PAUSE"); exit(0); } //endport eingeben printf ("\nGeben Sie den End-Port ein: "); scanf ("%i", &endport); if (endport < anfangsport || endport > 65535) { printf ("Unbekannter Port."); system("PAUSE"); exit(0); } //threads eingeben printf ("\nGeben Sie die Anzahl der Threads ein: "); scanf ("%i", &threads); if (threads > 1000) { printf ("Zu viele Threads."); system("PAUSE"); exit(0); } //anzahl der scans ab anfangsport berechnen anzahl = endport - anfangsport; //Threads starten mit for-Schleife for (count=0; count <= anzahl; count++) { if (threadscount < threads) { _beginthread (scan, 0, NULL); //--------------------------------HIER ist das 1. sleep sleep(1); threadscount++; anfangsport++; } else { count--; //--------------------------------HIER ist das 2. sleep sleep(1); } } sleep (1000); printf ("\nDone...\n\n"); system("PAUSE"); return 0; }
-
Ein Port-Scanner arbeitet normal mit Raw-Sockets und sendet einfach ein SYNC... naja... siehe diverse Projekte auf sourceforge.net
Und warum Du ein Sleep brauchst hab ich immer noch nicht verstanden... Du musst doch einfach nur warten, bis alle Threads sich beendet haben... dazu kannst Du _beginthredex nehmen und WaitForMultipleObjects (mehrmals wenn > 64 handles).
-
Und warum muss da jetzt gewartet werden??
-
Jochen Kalmbach schrieb:
Ein Port-Scanner arbeitet normal mit Raw-Sockets und sendet einfach ein SYNC...
das syn schickt er ja auch mit dem 'connect'. dauert zwar etwas, bis das abbricht, aber mit mehrern threads kann man ja schon ein paar connects parallel losschicken. und was die raw sockets unter win angeht: die taugen nicht viel. schicken manchmal icmp messages hinterher und machen kaum das, was man von ihnen erwarten würde.
-
Nur so ein Port-Scanner wird ab XP-SP2 nicht mehr Funktionieren...
http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx
-
Jochen Kalmbach schrieb:
Nur so ein Port-Scanner wird ab XP-SP2 nicht mehr Funktionieren...
http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspxzu glück gibt's seit jeher sogenannte 'packet driver'. da können sich m$ ihre "raw" sockets sonstwo hinstecken!
-
MasterCounter schrieb:
Und warum muss da jetzt gewartet werden??
also das 1. sleep is dafür, dass funktionport in der funktion scan richtig zugewiesen wird, da ich net wusste wie man das direkt der funktion übergiebt bzw. es nicht funktionierte, habe es so gemacht:
... void scan (void *dummy, int funktionport) // das ist die funktion scan mit der variable die empfangen werden soll anfangsport -> funktionport ... _beginthread (scan, 0, NULL, &anfangsport); // hier wird ein zeiger auf anfangsport übergeben ...
es ging dann net weil kein port übergeben wurde sondern immer die zahl 18, ka warum
und das 2. sleep is dafür dass die for-schleife net dauerhaft durchläuft, das würde 50% cpu-auslastung kosten
eigentlich funkt alles normal, mein prob is nur, auch wenn ich nur 1ms pro sleep warte, wergehen pro thread 2ms und dann sind 500 threads gleich schnell wie 1000 irgendwie
lg papanoah
-
Papa_Noah schrieb:
... void scan (void *dummy, int funktionport) // das ist die funktion scan mit der variable die empfangen werden soll anfangsport -> funktionport ... _beginthread (scan, 0, NULL, &anfangsport); // hier wird ein zeiger auf anfangsport übergeben ...
es ging dann net weil kein port übergeben wurde sondern immer die zahl 18, ka warum
das sollte doch eher so aussehen
void scan (void *anfangsport) { ... } ... _beginthread (scan, 0, (void*)anfangsport) ...
so ein void* wird in solchen apis benutzt, weil man da alles mögliche reintun kann. in deinem fall ist übergabe 'by value' besser, also keine adresse. sonst wenn alle threads eine variable benutzen gibt das nur ein durcheinander
-
juhu damit gehts, thx net und natürlich auch allen anderen
lg papanoah
-
Also nächstes mal sofort sagen worum es wirklich geht...
-
net schrieb:
Papa_Noah schrieb:
... void scan (void *dummy, int funktionport) // das ist die funktion scan mit der variable die empfangen werden soll anfangsport -> funktionport ... _beginthread (scan, 0, NULL, &anfangsport); // hier wird ein zeiger auf anfangsport übergeben ...
es ging dann net weil kein port übergeben wurde sondern immer die zahl 18, ka warum
das sollte doch eher so aussehen
void scan (void *anfangsport) { ... } ... _beginthread (scan, 0, (void*)anfangsport) ...
so ein void* wird in solchen apis benutzt, weil man da alles mögliche reintun kann. in deinem fall ist übergabe 'by value' besser, also keine adresse. sonst wenn alle threads eine variable benutzen gibt das nur ein durcheinander
hallo,
nun habe ich das problem wenn ich 2 werte übergeben will dann geht das nicht mehr, wobei der 1. wert normal übergeben wird, nur der 2. geht net, da wird IMMER 18 übergeben aber das stimmt net:... void scan (int* sip2, int *funktionport) { ...} main ... _beginthread (scan, 0, (int*)sip, (int*)anfangsport);
habe es so ungefähr gemacht, also gleich wie oben nur mit noch nem 2. wert, was is da falsch?
lg papanoah
-
typedef struct MyThreadParam { int sip2; int funktionport; // noch weitere Parameter... } MyThreadParam; MyThreadParam *param = new MyThreadParam; param->sip2 = 1; param->funktionport = 2; _beginthread(MyThread, 0, (void*) param); MyThread(void *pData) { MyThreadParam *p = (MyThreadParam) pData; int sip2 = p->sip2; int funktionport = p->funktionport; // ... }
-
Jochen Kalmbach schrieb:
typedef struct MyThreadParam { int sip2; int funktionport; // noch weitere Parameter... } MyThreadParam; MyThreadParam *param = new MyThreadParam; param->sip2 = 1; param->funktionport = 2; _beginthread(MyThread, 0, (void*) param); MyThread(void *pData) { MyThreadParam *p = (MyThreadParam) pData; int sip2 = p->sip2; int funktionport = p->funktionport; // ... }
danke, werd ich ausprobieren
lg papanoah