IP-Addresse inkrementieren



  • Hi,

    Ich habe ein Programm geschrieben, welches in einem Netzwerk, nach-
    einander zu einer IPRange, die der Benutzer eingibt, verbindet und dann
    anzeigt ob die Pcs an sind. Bei einer IP geht das auch, aber ihr kennt das sicher
    mit "inet_bla" und ntoa noths und wie die alle heissen, da kann man die IP
    ja in verschiedene Formen bringen, den String kann man ja nicht inkrementieren,
    also müsste es mit dem long gehen, aber ich habe so viele verschiedene sachen
    probiert. Er Inkrementiert zwar, aber so wird aus 127.0.0.1, nachdem in unsigned long umgewandelt, inkrementiert und wieder zurückgewandelt ein 2.0.0.80.
    WEiss jemand wie ich das lösen kann?
    Hier: http://www.pronix.de/pronix-274.html
    steht was von Big und Little Endian, kann das damit was zu tun haben?

    address.sin_addr.s_addr++;
    inet_ntop(AF_INET, &address, IPstart, 16);
    printf("Ipstart: %s", IPstart);
    

    Felix



  • Ich würde jede Nummer separat behandeln und die Iteration über eine Modulo Operation abbilden -> [0...254]=zahl % 255



  • 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