2017-12-25 16 views
0

Lassen Sie mich verwirrt sein, das Beispiel mit einem anderen Ergebnis.Ist es irgendwo falsch mit mir.Was ist mit inet_ntoa passiert?

#include <stdio.h> 
#include <string.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 


int main(){ 
    struct sockaddr_in src; 
    struct sockaddr_in dest; 

    memset(&src, 0, sizeof(src)); 
    src.sin_addr.s_addr = 0xEBAE277D; 

    memset(&dest, 0, sizeof(dest)); 
    dest.sin_addr.s_addr = 0x6700A8C0; 

    printf("saddr:%s\n", inet_ntoa(src.sin_addr)); 
    printf("daddr:%s\n", inet_ntoa(dest.sin_addr)); 
    printf("src:%15s------->dest:%15s\n", inet_ntoa(src.sin_addr), inet_ntoa(dest.sin_addr)); 
} 

das Ergebnis:

saddr:125.39.174.235 
daddr:192.168.0.103 
src: 125.39.174.235------->dest: 125.39.174.235 
+0

Was ist hier falsch? – Carcigenicate

+0

das Ergebnis von "src: 125.39.174.235 -------> dest: 125.39.174.235" ist richtig? –

Antwort

1

Die Dokumentation für inet_ntoa sagt:

Die inet_ntoa() Funktion wandelt die Internet-Host-Adresse in, in Netzwerk-Byte-Reihenfolge angegeben, in einen String in IPv4-Dezimalschreibweise. Die Zeichenfolge wird in einem statisch zugewiesenen Puffer zurückgegeben, die nachfolgende Aufrufe überschreiben werden.

(Das ist aus der Linux-man-Seite, andere haben andere Formulierung aber die Warnung über den statischen Puffer sollte dort irgendwo sein)

Sogenannte Sie inet_ntoa einmal wurde der Puffer gefüllt ist, und ein Zeiger auf es wurde zurückgegeben. Sie haben es erneut aufgerufen, der Puffer wurde überschrieben und ein Zeiger darauf wurde erneut zurückgegeben. Sie übergaben diese beiden Zeiger an printf, und es druckte den Pufferinhalt zweimal.

Um dies richtig auszuführen, müssen Sie das erste Ergebnis in den eigenen lokalen Puffer kopieren, bevor Sie es erneut aufrufen, oder einfach 2 printf s verwenden.

Oder Sie können stattdessen inet_ntop verwenden, was erfordert, dass Sie den Ausgabepuffer selbst bereitstellen. (Von Callern bereitgestellte Ausgabepuffer sind häufiger in neueren Schnittstellen; statische Ausgabepuffer erscheinen auf den ersten Blick einfach, verursachen aber auf lange Sicht Unfälle wie die in Ihrem Code.)

+0

Nices, Vielen Dank. –