Siehe die Definition von TCP-Header in /netinet/tcp.h:Warum hat ein 8-Bit-Feld eine Endiannität?
struct tcphdr
{
u_int16_t th_sport; /* source port */
u_int16_t th_dport; /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
# if __BYTE_ORDER == __LITTLE_ENDIAN
u_int8_t th_x2:4; /* (unused) */
u_int8_t th_off:4; /* data offset */
# endif
# if __BYTE_ORDER == __BIG_ENDIAN
u_int8_t th_off:4; /* data offset */
u_int8_t th_x2:4; /* (unused) */
# endif
u_int8_t th_flags;
# define TH_FIN 0x01
# define TH_SYN 0x02
# define TH_RST 0x04
# define TH_PUSH 0x08
# define TH_ACK 0x10
# define TH_URG 0x20
u_int16_t th_win; /* window */
u_int16_t th_sum; /* checksum */
u_int16_t th_urp; /* urgent pointer */
};
Warum wird das 8-Bit-Feld eine andere Reihenfolge in endianness hat? Ich dachte, nur 16-Bit und 32-Bit-Felder zählten mit Byte-Reihenfolge, und Sie könnten zwischen Endian mit Ntohs bzw. Ntohl konvertieren. Was wäre die Funktion für den Umgang mit 8-Bit-Dingen? Wenn es keine gibt, scheint es, dass ein TCP, der diesen Header auf einem kleinen Endian-Rechner verwendet, nicht mit einem TCP auf einem Big-Endian-Rechner arbeiten würde.
Seltsam, auf welchem System fanden Sie diese Header-Datei? – fbonnet
Debian Linux. Diese Version ist enthalten, wenn __USE_BSD #definiert ist. – Claudiu