Anzeige:
Ergebnis 1 bis 4 von 4

Thema: C -> char - Zeiger ? will nicht

  1. #1
    Registrierter Benutzer
    Registriert seit
    05.02.2005
    Beiträge
    11

    Unhappy C -> char - Zeiger ? rawsocket ? will nicht

    Guten morgen,
    ich hab mal wieder ein Problem mit C und Zeigern.
    Ich möchte gerne die IP von einem Raw-Socket ausgeben oder besser, die IP soll in einen String rein.
    gcc gibt auch bei mir keine Fehler aus.
    Die Funktion inet_ntoa(); gibt einen "char *" zurück.

    Code:
    #include <stdio.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <netinet/ip.h>
    #include <netinet/tcp.h>
    int main(int argc, char *argv[])
    {
    
       char *zwischenspeicher;
       char *srcip, *dstip;
       char buffer[1024];
       struct in_addr addr;
       int r, bytes;
       struct iphdr *ip;
    
       r = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
       if (r == -1)
       {
          perror("socket() failed");
          return 1;
       }
       bytes = recv(r, buffer, sizeof(buffer), 0);
       ip = (struct iphdr *) buffer;
       addr.s_addr = ip->saddr;
       srcip = inet_ntoa(addr);
       printf("IP-Address S \t%s\n", srcip);
    
    }
    Wenn ich das Programm ausführe bekomme ich die korrekte IP-Address von einem IP-Packet.
    Wenn ich jedoch noch 3 Zeilen hinzufüge und das printf() in der letzten Zeile verschiebe sieht das so aus :
    Code:
    #include <stdio.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <netinet/ip.h>
    #include <netinet/tcp.h>
    int main(int argc, char *argv[])
    {
    
       char *zwischenspeicher;
       char *srcip, *dstip;
       char buffer[1024];
       struct in_addr addr;
       int r, bytes;
       struct iphdr *ip;
       r = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
       if (r == -1)
       {
          perror("socket() failed");
          return 1;
       }
       bytes = recv(r, buffer, sizeof(buffer), 0);
       ip = (struct iphdr *) buffer;
       addr.s_addr = ip->saddr;
       srcip = inet_ntoa(addr);
       addr.s_addr = ip->daddr;
       dstip = inet_ntoa(addr);
       printf("IP-Address S \t%s\n", srcip);
       printf("IP-Address D \t%s\n", dstip);
    }
    bekomme ich sowohl beim der SourceIP meine Lokale IP z.b 192.168.1.2 als auch bei der DestinationIP die gleiche.

    Was mache ich falsch ?
    Kann mir jemand helfen ?


    Gruß ac3x
    Geändert von ac3x (19-07-2005 um 11:40 Uhr)

  2. #2
    Registrierter Benutzer Avatar von Corcovado
    Registriert seit
    10.07.2005
    Beiträge
    30
    Hallo, ich weiss nich ob ich Dir viel weiterhelfen kann, ich versuchs mal..
    Kann es sein, dass Du addr bei inet_ntoa(addr) per Reference uebergibst? - Danach aendert sich eben die Membervariable von addr, jedesmal wenn Du sie extern abaenderst, an der Stelle mit. Abhilfe waere, by Value zu uebergeben!?
    Hahahahahahaha... (Winx)

  3. #3
    Registrierter Benutzer
    Registriert seit
    16.06.2003
    Beiträge
    73
    Hallo,

    die man page von inet_ntoa weisst extra darauf hin, dass inet_ntoa einen STATISCH allokierten Buffer für den Ergebnisstring benutzt.
    Das heisst, es schreibt beim ersten und beim zweiten Aufruf in den selben Buffer. Es überschreibst also mit dem zweiten Aufruf das Ergebnis des ersten Aufrufs. Da die printf erst beide NACH dem zweiten Aufruf ausgeführt werden, erhälst du nur die IP Adresse, welche vom zweiten Aufruf erzeugt wurde.
    Besser funktionierts wenn du den printf gleich nach jedem inet_ntoa Aufruf plazierst:

    Code:
       addr.s_addr = ip->saddr;
       srcip = inet_ntoa(addr);
       printf("IP-Address S \t%s\n", srcip);
       addr.s_addr = ip->daddr;
       dstip = inet_ntoa(addr);
       printf("IP-Address D \t%s\n", dstip);
    Viele Grüsse

    almoeli

  4. #4
    Registrierter Benutzer
    Registriert seit
    05.02.2005
    Beiträge
    11

    Thumbs up

    ok, danke !

    ich habs jetzt per strncpy gemacht, es geht.


    Gruß ac3x

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •