2010-11-25 209 views
1
printf(" Src Address\n"); 
for(i = 0;i < 4;i++) 
    printf(" %d ",((ip->ip_src.s_addr)&(0x0FF<<(i*8)))>>(i*8)); 

此顯示O/P爲127.0.0.0如我使用環回,但是當我做使用相同顯示在控制檯

for(i = 0;i <6; i++) 
    printf("dest ether:%c",((ethernet->ether_dhost)&(0x0FF<<(i*8)))>>(i*8)); 

同一2顯示以太網地址我得到的誤差是錯誤:無效的操作數爲二進制&

here u_char ether_dhost [6];和存儲IP地址的變量類型是無符號長整型...如何顯示以太網地址..

回答

3

s_addr字段是存儲IPv4地址的32位整數。使用這個二進制&運算符可以很好地工作。 ether_dhost字段OTOH是一個6字節的數組,您不能像操作s_addr那樣操作它。但話又說回來,你不必:

for(i = 0; i < 6; i++) 
    printf(":%c"+!i, ethernet->ether_dhost[i]); 

順便說一句,你的IP地址代碼要複雜得多,它需要是:

for(i = 0; i < 32; i += 8) 
    printf(".%d"+!i, (ip->ip_src.s_addr>>i)&0xff); 
+3

```!``技巧是*非常*聰明。 – caf 2010-11-25 07:57:18

0

如果您正在使用標準struct inet_addrstruct ether_addr,有標準的功能。

printf("inet address: %s\n", inet_ntoa(…)); 
printf("ether address: %s\n", ether_ntoa(…));