IP-Addresse inkrementieren
-
hi,
ip-adressen sind 32-bittige unsigned longs, allerdings im 'big-endian' format.
also: vor dem hochzählen mit einer 'little-endian' x86-box solltest du's erstmal umwandeln:struct in_addr ipaddr; ipaddr.S_un.S_addr = inet_addr ("127.0.0.1"); ipaddr.S_un.S_addr = htonl(htonl(ipaddr.S_un.S_addr)+1); // umwandeln vor und nach der addition printf ("%s\n", inet_ntoa(ipaddr));
btw: wenn du die zweite stelle hochzählen, willst, dann 0x100 dazu addieren usw.
-
Hi,
Danke für die Antworten, die erste hab ich leider gar nicht erst kapiert^^,
die zweite habe ich gleich ausprobiert. Allerdings habe ich mich gewundert, warum esstruct in_addr ipaddr;heißen soll... Ich habe da "sockaddr_in" und was bringt hton1 ?
Hier mal mein ganzer Code, könntet Ihr mir sagen, wie ich das da jetzt genau machen muss?[code]
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define BUF 1024int main () {
int sock;
struct sockaddr_in address;
char IPstart[16], IPend[16], lol;printf(" - Creating Socket.\n");
if (sock = socket(AF_INET, SOCK_STREAM, 0) > 0)
printf(" - Socket OK.\n\n");
else {
printf(" - Socketcreation FAILED\n\n");
return 0;
}printf (" - IPRange Start: ");
std::cin >> IPstart;
printf(" - OK.\n");printf (" - IPRange End : ");
std::cin >> IPend;
printf(" - OK.\n");address.sin_family = AF_INET;
address.sin_port = htons(80);
inet_aton (IPstart, &address.sin_addr);//Hier sollte das inkrementieren drin sein, SChleife mach ich später
inet_ntop(AF_INET, &address, IPstart, 16);
printf("Ipstart: %s", IPstart);if (connect ( sock, (struct sockaddr
&address, sizeof (address)) == 0)
{
printf (" - %s Rechner an\n", IPstart, ntohs(address.sin_port));
} else {
printf(" - %s Rechner aus\n", IPstart, ntohs(address.sin_port));
}
close (sock);return EXIT_SUCCESS;
}
]
-
Felixity schrieb:
Allerdings habe ich mich gewundert, warum es
struct in_addr ipaddr;heißen soll... Ich habe da "sockaddr_in" und was bringt hton1 ?
in einer 'sockaddr_in' steckt eine 'in_addr' struct schon mit drin (für die ip-adresse).
das 'htonl' ist der (portable) endian-dreher für 'long' variablen.

-
Hi,
hton1 scheint der nich zu kennen^^error: `hton1' undeclared (first use this function)
Ist das wichtig zu sagen, dass mit suse 9.3 arbeite

Auf jeden Fall schon mal vielen Dank für die schnellen antworten
Felix
-
Hallo,
htonl -> Buschstabiere -> HA TE O EN EL
-
Oh mann

da hätt ich auch draufkommen können^^,
jetzt kennt er zwar htonL aber:address.sin_addr.s_addr = htonl(htonl(address.sin_addr.s_addr)++);==>
error: non-lvalue in increment
Warum das schon wieder

Danke für die Antowrten
-
Felixity schrieb:
Warum das schon wieder

nicht ++, sondern +1.

-
Hi,
bin jetzt registriert. Mein Code:
#include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define BUF 1024 int main () { int sock; struct sockaddr_in address; char IPstart[16], IPend[16], lol; printf(" - Creating Socket.\n"); if (sock = socket(AF_INET, SOCK_STREAM, 0) > 0) printf(" - Socket OK.\n\n"); else { printf(" - Socketcreation FAILED\n\n"); return 0; } printf (" - IPRange Start: "); std::cin >> IPstart; printf(" - OK.\n"); printf (" - IPRange End : "); std::cin >> IPend; printf(" - OK.\n"); address.sin_family = AF_INET; address.sin_port = htons(80); inet_aton (IPstart, &address.sin_addr); address.sin_addr.s_addr = htonl(htonl(address.sin_addr.s_addr)+1); inet_ntop(AF_INET, &address, IPstart, 16); printf("Ipstart: %s", IPstart); if (connect ( sock, (struct sockaddr *) &address, sizeof (address)) == 0) { printf (" - %s Rechner an\n", IPstart, ntohs(address.sin_port)); } else { printf(" - %s Rechner aus\n", IPstart, ntohs(address.sin_port)); } close (sock); return EXIT_SUCCESS; }Ausgabe:
PhateCyba@linux:~> cd cpp
PhateCyba@linux:~/cpp> g++ -o scan scan.cc
PhateCyba@linux:~/cpp> ./scan
- Creating Socket.
- Socket OK.- IPRange Start: 127.0.0.1
- OK.
- IPRange End : 127.0.0.3
- OK.
Ipstart: 2.0.0.80 - 2.0.0.80 Rechner aus
PhateCyba@linux:~/cpp>Dasselbe, wie vorher.
-
OMG
egal ob ich als startaddy
127.0.0.1 oder 123.111.111.1 eingeb und egal ob ich um 1, 10 oder 100 inkrementiere IMMER KOMMT 2.0.0.80 RAUS OMG???????
Kann mir einer sagen was das heisst?Felix
-
Hi,
vielleicht guckst du dir einfach mal die Syntax von prinf an. Was soll das tun:
printf(" - %s Rechner aus\n", IPstart, ntohs(address.sin_port));?
Außerdem sehe ich überhaupt keine Schleife? Es soll doch von eine Startadresse bis zu einer Endadresse gescannt werden, oder nicht?
Deine Erhöung wird funktionieren, allerdings würde ich einfach die Zahl umwandeln, um die du die IP-Adresse erhöhen möchtest:
address.sin_addr.s_addr = address.sin_addr.s_addr+htonl(1); printf("%s\n",inet_ntoa(address.sin_addr));Dadurch sparst du dir eine Umwandlung.
So, allerdings ist mir auch nicht ganz klar, was die Zeile machen soll:
inet_ntop(AF_INET, &address, IPstart, 16);Und nebenbei: Besser du entscheidest dich für C oder C++, beides zu misschen ist nicht gerade sauberer Stil.