C++ Von- Bis IP Adresse zählen
-
Hi Leute,
bin total am verzweifeln, wie stelle ich es an das mein Programm von einer IP Adresse zu einer IP Adresse zählt, es soll jedoch nicht die Anzahl ausgegeben werden sondern pro Durchgang jeweils eine andere IP bis die "End" IP erreicht ist. Hab schon einiges fertig geschrieben aber hab kleider 0 Plan wie ich das Problem lösen soll. Sinn und zweck der Sache ist eine kleine Scan Engine die überprüft wo im Lan ein Server an einem Port horcht, ist alles soweit fertig bis auf das IP zählenIch bin für jede URL und jeden Hinweiß dankbar, wer auch Interesse hat und mir dabei hilft bekommt nätürlich eine Kopie des fertigen Programms welches Scripte auf dem Server ausführt und die generierten Dateien verschlüsselt übers Netz versendet. Bisher habe ich den Client, Server und ein Konfig Interface für Windows geschrieben, mein Kollege schreibt zur Zeit eine Anbindung an eine MySQL Datenbank und ein Linux Server ist in Arbeit.
Bitte helft mir bei dem IP Scanner
-
Nur ein spontaner Einfall, ohne viel Ahnung von Netzwerkprogrammierung zu haben: Du nimmst Dir vier ints, die die Zahlen zwischen den Punkten bei der IP-Adresse repräsentieren. Diese ints zählst Du in Schleifen bis zu einer gewünschten Höhe hoch. Bei jedem Durchlauf wandelst Du die 4 ints in Zeichenketten um und baust aus diesen die Zeichenkette, die die ip enthält. Diese kannst Du dann mit inet_addr() umwandeln, oder etwas anderes damit tun.
(Hm, aber vielleicht habe ich auch mal wieder nur eine Frage falsch verstanden...denn darauf wärst Du wahrscheinlich auch selbst gekommen)
-
int main() { int start[4]={192,168,0,0}; int ende[4]={192,168,1,0}; int i=0; while(true) { cout << start[0]<<"."<<start[1]<<"."<<start[2]<<"."<<start[3]<<endl; for(i=0;i<4&&start[i]==ende[i];i++); if(i==4) break; start[3]++; for(int j=3;j>0;j--) { if(start[j]>255) { start[j]=0; start[j-1]++; } } } return 0; }
-
Eine IP hat 32 Bit, nicht 4*32 Bits wie bei obigem Code.
Da du die IPs eh als DWORD vorliegen hast, wenn du mit der WinAPI programmierst, kannst du durch einfaches Inkrementieren alle IPs durchzählen.
Dann musst du nur noch kurz testen, ob die IP gültig, also nicht x.x.x.0 oder x.x.x.255, ist:
for(DWORD ip = start_ip; ip != stop_ip; ++ip) { if(valid_ip(ip)) { scan(ip); } }
-
Eine IP hat 32 Bit, nicht 4*32 Bits wie bei obigem Code.
??????????????????????????????????????????
Bei mir auch ........
-
cd9000 schrieb:
Eine IP hat 32 Bit, nicht 4*32 Bits wie bei obigem Code.
...Er hat nicht wie du die Bitrepraesentation zum Testen der Range genutzt, sondern
die "Human-readable"-Version :).mfg
v R
-
Vielen Dank für eure Mühe, ich werde mich mal ans letzte Beispiel wagen und poste was bei rausgekommen ist, mal schauen wie ich die Funktion "validIP" schreiben werde, ich halte euch auf dem laufenden, wer mehr zum Thema wissen möchte kann eine mail an seaydv@web.de schicken,
Gruss David
-
Habe jetzt folgendes:
String ipstart,ipend; unsigned int a,b; TIniFile *ip; ip = new TIniFile("IP.ini"); ipstart = ip->ReadString("Von IP","IP",""); ipend = ip->ReadString("Bis IP","IP",""); a = StrToInt(ipstart); b = StrToInt(ipend); for(DWORD ip = a; ip != b; ++a) { ClientSocket1->Address = ip; ClientSocket1->Active; ClientSocket1->Open(); }
Es lässt sich Kompilieren,aber ich bekomme nen dicken Fehler. Er mekkert das z.B 192.168.6.1 kein gültiger Integer Wert ist, halt wegen der Punktnotation. Weiß jemand zufällig Rat ??
-
virtuell Realisticer schrieb:
Er hat nicht wie du die Bitrepraesentation zum Testen der Range genutzt, sondern
die "Human-readable"-VersionDie "Human-readable"-Version besteht aus 4 chars.
-
Update:
String ipstart,ipend; unsigned long first_ip,last_ip; char temp[16]; TIniFile *ip; ip = new TIniFile("IP.ini"); ipstart = ip->ReadString("Von IP","IP",""); ipend = ip->ReadString("Bis IP","IP",""); strcpy(temp,ipstart.c_str()); first_ip = inet_addr(temp); strcpy(temp,ipend.c_str()); last_ip = inet_addr(temp); for(DWORD ip = first_ip; ip != last_ip; ++first_ip) { ClientSocket1->Address = IntToStr(ip); ClientSocket1->Active; ClientSocket1->Open(); }
Was meint ihr ?
-
cd9000 schrieb:
virtuell Realisticer schrieb:
Er hat nicht wie du die Bitrepraesentation zum Testen der Range genutzt, sondern
die "Human-readable"-VersionDie "Human-readable"-Version besteht aus 4 chars.
Das stimmt schon, aber wenn er nur die Zahlen vergleicht, isses egal ob es en
char, int, float oder double hat, solange er sich an die Grenzen haelt und es
duerfen natuerlich keine Gleitkommazahlen sein :D.Bei char ist die Grenze natuerlich schon vom Typ her gegeben :). Aber du hast
natuerlich voellig recht.mfg
v R
-
David081 schrieb:
Update:
String ipstart,ipend; unsigned long first_ip,last_ip; char temp[16]; TIniFile *ip; ip = new TIniFile("IP.ini"); ipstart = ip->ReadString("Von IP","IP",""); ipend = ip->ReadString("Bis IP","IP",""); strcpy(temp,ipstart.c_str()); first_ip = inet_addr(temp); strcpy(temp,ipend.c_str()); last_ip = inet_addr(temp); for(DWORD ip = first_ip; ip != last_ip; ++first_ip) { ClientSocket1->Address = IntToStr(ip); ClientSocket1->Active; ClientSocket1->Open(); }
Was meint ihr ?
Das sieht prinzipiell gut aus, allerdings kommt ein kleines Problem beim nutzen
der Funktion inet_addr() daher. Diese Funktion liefert als Rueckgabewert einen
32-Bit Binaerwert zurueck. Bei einem Fehler tut sie das ebenfalls und zwar
ueblicherweise 32 1er Bits (255.255.255.255). Das Problem ist, dass dies eine
gueltige Adresse ist (IPv4 eingeschraenkte Broadcastadresse). Du kannst also
diese Adresse nicht mit inet_addr() verwenden, da nicht klar ist ob es ein
Fehler darstellt oder nicht. Es koennte auch sein, dass inet_addr() bei einem
Fehler 32 0-Bits zurueckgibt (0.0.0.0) auch dies ist eine gueltige Adresse
(die Catch-All-Address). Unter Linux/Unix gibt es daher die neue Funktion
inet_pton() bzw. inet_ntop(). Ich kann dir allerdings nicht sagen ob es die
auch unter Windows gibt. Am besten du schaust mal in der Doku nach.mfg
v R
-
Vielen Dank, das IP zählen läuft wie am Schnürchen !
Habe jetzt folgendes Problem:
ClientSocket1->Address = String(ipresult); ClientSocket1->Open();
Mit was kann ich Haargenau überprüfen ob ein Connect zum server erfolgreich war oder nicht, bei erfolg hole ich die IP mit:
ListBox1->Items->Append(ClientSocket1->Address);
Ich habe das Erreignis OnConnect und OnError versucht aber leider ohne Erfolg, hat jemand ne Ahnung ?