2013-07-04 114 views
1

我用這種 「結構iphdr * ip_reply」 與此功能來讀取接收到的分組:printf的 「__be32」 值類型

recvfrom的(的sockfd,緩衝液,的sizeof(結構iphdr)+的sizeof(結構 icmphdr) ,0,(struct sockaddr *)& connection,& addrlen))

ip_reply =(struct iphdr *)buffer;

 struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) 
    __u8 ihl:4, 
      version:4; #elif defined (__BIG_ENDIAN_BITFIELD) 
    __u8 version:4, 
      ihl:4; 

    __u8 tos; 
    __be16 tot_len; 
    __be16 id; 
    __be16 frag_off; 
    __u8 ttl; 
    __u8 protocol; 
    __sum16 check; 
    __be32 saddr; 
    __be32 daddr; 
    /*The options start here. */ }; 

如何可以顯示 「SADDR」 「DADDR」 與printf的://鑄造=>從接收到的分組

這是結構參數讀取IP報頭?

回答

0

libc中有一組函數用於處理這些轉換。在你的情況下,你可以使用函數:inet_ntoa()。基本上,它以網絡二進制格式(網絡字節順序)獲取地址,並使用點符號將IPv4地址檢索到字符串中。

如果您使用的是unix,我建議您查看手冊頁以查看正確的用法。

1

使用正確的function:再用ntohl()

此功能旨在用於翻譯網絡到主機(這就是爲什麼它的名字與NTOH開始),你不必在意的字節序您系統:如果需要的話,C庫會翻譯它。