2017-12-25 26 views
0

私は、別の結果との例を困惑させてください。それはどこかに間違っていますか?inet_ntoaについてどうしましたか?

#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)); 
} 

結果:

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

ここで何が問題なのですか? – Carcigenicate

+0

"src:125.39.174.235 -------> dest:125.39.174.235"の結果は正しいですか? –

答えて

1

inet_ntoaのドキュメントは言う:

INET_NTOA()関数は、文字列に、ネットワークバイトオーダでのインターネットホストアドレスを変換し、 IPv4のドット区切り10進表記です。文字列は静的に割り当てられたバッファーに戻され、それ以降の呼び出しは上書きされます。

(これは、Linuxのmanページからだ。他の人が別の文言を持っていますが、静的バッファに関する警告がどこかにあるはずです)

だから、バッファがいっぱいにして、一度inet_ntoaと呼ばれ、へのポインタそれは返されました。あなたはもう一度それを呼び出し、バッファーは上書きされ、そのポインターが再び戻されました。 printfに両方のポインタを渡し、バッファの内容を2回印刷しました。

これを正しく実行するには、最初のinet_ntoa結果を自分のローカルバッファにコピーしてから再度呼び出してください。そうでない場合は、2 printfを使用してください。

代わりにinet_ntopを使用できます。出力バッファを自分で用意する必要があります。 (呼び出し側が提供する出力バッファは、新しいインターフェイスではより一般的です;静的出力バッファは最初は簡単ですが、長期的にはコード内のような事故を引き起こします)。

+0

Nices、ありがとうございました。 –

関連する問題