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 es

    struct 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 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);

    //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.


Anmelden zum Antworten