Я запрограммировал необработанные сокеты и столкнулся с проблемой преобразования поля структуры iphdr в порядок байтов хоста. Кажется, некоторые поля необходимо преобразовать, а другие нет.
Вот мой код, который я пытаюсь понять:)
printf("%s -> %s (size: %u, id: %u, ttl: %u, hlen: %u, ver: %u, proto: %u)\n",
source, destination,
ntohs(ip_packet->tot_len), ntohs(ip_packet->id),
ip_packet->ttl, ip_packet->ihl,
ip_packet->version, ip_packet->protocol);
Как видите, tot_len и id должны быть преобразован в порядок байтов хоста. Другие поля в порядке, если я не использую htons (). Как я вижу, поля uint8 не преобразуются.
Как определить, какие поля следует преобразовать в байты хоста, чтобы заставить код работать на разных ядрах Linux?
Вот структура iphdr у меня есть:
struct iphdr
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned int ihl:4;
unsigned int version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
unsigned int version:4;
unsigned int ihl:4;
#else
# error "Please fix <bits/endian.h>"
#endif
uint8_t tos;
uint16_t tot_len;
uint16_t id;
uint16_t frag_off;
uint8_t ttl;
uint8_t protocol;
uint16_t check;
uint32_t saddr;
uint32_t daddr;
/*The options start here. */
};