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

это показывает о/р, как 127.0.0.0, как я использую обратную петлю, но когда я сделать то же 2 дисплея сетевой адрес, используя тот жеотображения на консоли

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

ошибка я получаю сообщение об ошибке: недействительные операнды до двоичных данных &

здесь u_char ether_dhost [6]; и переменная, хранящая ip-адрес, имеет тип unsigned long int ... как отображать адрес ethernet.

ответ

3

Поле s_addr представляет собой 32-разрядное целое число, в котором хранится IPv4-адрес. Использование двоичного оператора & на этом отлично работает. Поле 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

Это `+! I` трюк - очень * умный. – caf 2010-11-25 07:57:18

0

Если вы используете стандартный struct inet_addr и struct ether_addr, для этого есть стандартные функции.

printf("inet address: %s\n", inet_ntoa(…)); 
printf("ether address: %s\n", ether_ntoa(…)); 
Смежные вопросы