Expi Geschrieben 24. Juli 2005 Geschrieben 24. Juli 2005 Hy, hat mir jemand nen Link zu ner Page die erklärt wie man nen Scanner mit C baut ? Soll bloß ein Konsolenapp sein, keine Gui. Hab viele Beispiele für C++ gefunden, aber nichts für C. Die Sourcen von IpcScan oder ScanSql wären genial, die 2 Scanner sind echt fein. Thanks Zitieren
Goos Geschrieben 25. Juli 2005 Geschrieben 25. Juli 2005 Was willst damit genau machen? Goos Zitieren
Expi Geschrieben 25. Juli 2005 Autor Geschrieben 25. Juli 2005 Ich will verstehen wie genau das funktioniert. Vorallem die SQL/NT Anmelderoutine interessiert mich. Aber genauso das Threaden und das aufsplitten der Range, in einzelne IP's, mit der man das Prog startet. Greets Ex Zitieren
Expi Geschrieben 25. Juli 2005 Autor Geschrieben 25. Juli 2005 Weil ich in C Programmiere und nicht in C++. Dass kommt noch. Zitieren
Goos Geschrieben 25. Juli 2005 Geschrieben 25. Juli 2005 Ich wuerde sagen, dann hast du jetzt ein Problem. Der Datenbankzugriff und auch die NT Anmeldung sind meines Erachtens nicht unter ANSI C moeglich. Die einzige Alternative sind vielleicht C++ Dlls in denen der Zugriff gehandlet wird und die du dann auch unter ANSI C ansprechen kannst. Ich halte dein Anliegen sogesehen fuer nicht allzu sinnvoll Goos Zitieren
Expi Geschrieben 25. Juli 2005 Autor Geschrieben 25. Juli 2005 Das Problem ist, dass ich den Scanner in ein bereits vorhandenes C Programm integrieren will. Das umschreiben des Progs würde viel zu viel Zeit beanspruchen. Du magst recht haben über den Sinn dieses Vorhabens, aber mir bietet sich leider keine andere Möglichkeit. Kannst du (oder jemand anders) mir trotzdem helfen das ganze ans laufen zu bringen? Fangen wir mit dem Pingen (mit Threads) an und arbeiten uns zum Anmelden an SQL/NT heran. Sagen wir mal, ich möchte das der Scanner unendlich lange läuft, also ohne Range starten, und maximal 20 Threads erzeugt. Dann müsste das doch ungefähr so aussehen. (Garantiert Fehler drin, da ich noch nie was derartiges geschrieben habe) struct sockaddr_in scan; int maxNtThread = 20; // maximal Anzahl von Threads int curNtThread = 0; // Derzeitige Anzahl von Threads int ntPort = 139; // NT Port int TermNtThread = 0; // Falls auf 1 gesetzt werden alle Threads beendet void *scannerNT(void *addr) { int s; if(TermNtThread == 1) { pthread_exit( NULL ); } s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { curNtThread--; return NULL; } // jetzt zu der Ip Connecten scan.sin_family = AF_INET; /* inet_addr() wandelt einen String mit einer IPAdresse in 'dotted' Schreibweise in eine vom Rechner lesbare Form um */ scan.sin_addr.s_addr = inet_addr(addr); scan.sin_port = htons(ntPort); if(connect(s, (struct sockaddr *)&scan, sizeof(scan)) == -1) { close(s); } else { printf("Port offen!"); close(s); } curNtThread--; return NULL; } void *ntscaninit(void *arg) { int a,b,c,d; char destaddr[20]; pthread_t p1[maxNtThread]; while(1) { for(a = 70; a < 255; a++) { // Mit Blacklist-IP's abgleichen if(((a >= 127) && (a <= 170)) || ((a >= 192) && (a <= 217))) { continue; } for(b = 0; b < 255; b++) { for(c = 0; c < 255; c++) { for(d = 1; d < 255; d++) { wsprintf(destaddr,"%i.%i.%i.%i", a, b, c, d); // Falls TermNtThread == 1 Thread beenden if(TermNtThread == 1) { pthread_exit( NULL ); } // Falls derzeitige Threads größer oder gleich maxNtThread ist, diese While Schleife wiederholen while(curNtThread >= maxNtThread) { printf(""); // ohne dieses printf funzt die Schleife nicht, k.a. wieso continue; } curNtThread++; pthread_create(&p1[curNtThread], NULL, scannerNT, &destaddr); pthread_detach(p1[curNtThread]); } } } } return NULL; } Was kann man da verbessern? Bzw das mit den Threads besser regeln. Und wenn ich den Scanner so starte, dann pingt er manche IP's doppelt. Also eigentlich müsste er so pingen: 70.0.0.1, 70.0.0.2, 70.0.0.3 usw Aber er macht meistens: 70.0.0.1, 70.0.0.2, 70.0.0.2, 70.0.0.3, 70.0.0.3 usw Woran liegt das ? Und wieso spielt die while anweisung ohne das printf nicht mit? Fragen über Fragen. Bin dankbar für jede Hilfe. Thx Zitieren
Klotzkopp Geschrieben 25. Juli 2005 Geschrieben 25. Juli 2005 Bzw das mit den Threads besser regeln. Und wenn ich den Scanner so starte, dann pingt er manche IP's doppelt.Das wundert mich nicht. Du übergibst jedem Thread die Adresse desselben char-Arrays (destaddr). Wie willst du sicherstellen, dass der Thread den Inhalt ausgewertet hast, bevor du ihn in der Schleife wieder änderst? Zitieren
Expi Geschrieben 25. Juli 2005 Autor Geschrieben 25. Juli 2005 Und wie bring ich das in Ordnung ? Zitieren
Klotzkopp Geschrieben 25. Juli 2005 Geschrieben 25. Juli 2005 Indem du entweder für jeden Thread ein eigenes Array benutzt oder durch Synchronisationsobjekte (Events o.ä.) sicherstellst, dass die Schleife erst dann weiterläuft, wenn der Thread das Array ausgewertet oder kopiert hat. Zitieren
Expi Geschrieben 27. Juli 2005 Autor Geschrieben 27. Juli 2005 würde es reichen wenn ich es so mache? void *scannerNT(void *addr) { char destaddr[20]; strcpy(destaddr, addr); ..... scan.sin_addr.s_addr = inet_addr(destaddr); ..... } oder war das jetzt ein Denkfehler? Zitieren
Klotzkopp Geschrieben 27. Juli 2005 Geschrieben 27. Juli 2005 würde es reichen wenn ich es so mache?Nein. Der Fehler würde seltener auftreten, aber er ist immer noch da. Wirklich sicher geht es nur so, wie ich es beschrieben habe. Zitieren
Expi Geschrieben 27. Juli 2005 Autor Geschrieben 27. Juli 2005 Nein. Der Fehler würde seltener auftreten, aber er ist immer noch da. Wirklich sicher geht es nur so, wie ich es beschrieben habe. Kannst mir da ein Beispiel für geben? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.