2013-07-04 2 views
1

Я использую это "структура iphdr * ip_reply" читать принятый пакет с этой функцией:Printf "__be32" значение типа

recvfrom (sockfd, буфер, SizeOf (структура iphdr) + SizeOf (STRUCT icmphdr) , 0, (struct sockaddr *) & подключение, & addrlen))

ip_reply = (struct iphdr *) buffer; // отливка => прочитать заголовок IP из принятого пакета

это параметр структуры:

 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?

ответ

0

В libc есть группа функций, которая имеет дело с этими преобразованиями. В вашем случае вы можете использовать функцию: inet_ntoa(). В принципе, он получает адрес в сетевом двоичном формате (сетевой байтовый порядок) и получает IPv4-адрес с использованием точечной нотации в строку.

Если вы используете UNIX SO, я предлагаю вам посмотреть страницы руководства, чтобы увидеть правильное использование.

1

Используйте правильный function: ntohl()

Эта функция предназначена для использования, чтобы перевести сеть TO HOST (именно поэтому его имя начинается с ntoh), и вы не должны заботиться о порядок байтов от вашего система: библиотека C переведет ее для вашего, если необходимо.

Смежные вопросы