Bol by som rád keby mi niekto objasnil môj problém. Do školy robím projekt, ktorý vyžaduje použitie Raw soketov v C++. Cez ne posiealm IGMP pakety, ale IP hlavičku si vyplňujem sám. Kernel mi vypní len ID, zdrojovú adresu a kontrolný súčet. Pre IP hlavičku som si vytvoril štruktúru:
/**
* Header of IPv4 datagram.
*/
struct header_t {
unsigned char version_ihl; /**< IP version | header size */
unsigned char tos; /**< type of service */
uint16_t tot_len; /**< whole size of IP packet */
uint16_t id; /**< ID of datagram if it's fragmented */
uint16_t frag_off; /**< flags and shift offset (0x4000) */
unsigned char ttl; /**< time to live */
unsigned char protocol; /**< protocol of upper layer */
uint16_t check; /**< check sum (CRC) */
in_addr_t saddr, daddr; /**< source & destination IP address */
} header;
Následne odchytávam prijaté datagramy. Problém je, že položka celkovej veľkosti IP datagramu je 16 bitová a mala by byť v NBO (Network byte order = Big Endian). Keď sa ale pokúsim vyplniť položku v IP hlavičke pomocou funkcie htons() tak mi kernel odmietne poslať datagram (funkcia sendto()). Na Ubuntu to funguje, ale vo FreeBSD nie. Samozrejme na FreeBSD zase funguje ak zadám hodnotu bez funkcie htons(). Je v tom ale zmätok, pretože ak prijmem svoje datagramy tak je položka tot_len vyplnená v little endiane, ale pakety, ktoré dostávam zo siete sú korektne v big endiane. Preto keď prijmem datagram tak si môžem len tipnúť aký veľký je paket (nemôžem sa spoľahnúť či je v Little alebo Big endiane). Mne to však v big endiane kernel zamietne zobrať. Neviete čím by to mohlo byť?