سؤال

وانظر تعريف رأس TCP في /netinet/tcp.h:

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 */
};

وماذا حقل 8 بت يكون ترتيب مختلف في endianness؟ فكرت فقط الحقول 16 بت و 32 بت يهم مع النظام بايت، ويمكن تحويل بين endians مع ntohs وntohl، على التوالي. ما يمكن أن تكون وظيفة للتعامل مع الأشياء 8 بت؟ إذا كان هناك لا شيء، ويبدو أن TCP باستخدام هذا الرأس على جهاز endian قليلا لن يعمل مع TCP على جهاز endian كبيرة.

هل كانت مفيدة؟

المحلول

وهناك نوعان النوع من النظام. واحد هو ترتيب بايت، هو واحد من أجل bitfield. لا يوجد ترتيب القياسية حول ترتيب bitfield في لغة C. ان ذلك يعتمد على مترجم. عادة، يتم عكس ترتيب bitfields بين endian كبيرة وصغيرة.

نصائح أخرى

وهذا يعتمد مترجم وغير المحمولة. كيف حقول بت يتم ترتيب هو تنفيذ التابعة، فإنه سيكون أفضل بكثير هنا لاستخدام حقل 8 بت والتحول / قناع للحصول على الحقول الفرعية.

ومن الممكن أن في هذا الجهاز يشير endianess أيضا للنظام قليلا وكذلك ترتيب بايت. هذه المقالة ويكيبيديا يذكر أن هذا هو الحال في بعض الأحيان.

وما أفهمه هو أن يأمر قليلا وendianness عموما هما شيئان مختلفان. الهياكل مع حقول بت هي عموما ليست المحمولة عبر المجمعين / أبنية. أحيانا ifdefs يمكن استخدامها لدعم أوامر شراء قليلا مختلفة. في هذه الحالة endianness لا يهم حقا، وأنه ينبغي أن يكون ifdef حول ترتيب بعض الشيء. على افتراض أن بعض endianesses ديك بعض الشيء النظام قد يكون صحيحا في بعض الحالات.

وقراءتي للتعليق هو أن اثنين من حقول بايت واحد وتفسر معا كقيمة اثنين بايت (أو كانت - يبدو وكأنه بايت واحد غير المستخدمة على أي حال). بدلا من إعلان واحد قيمة اثنين بايت، يعلنون قيمتين بايت واحد ولكن عكس ترتيب إعلان اعتمادا على endian نيس.

وقد يكون من المفيد أن نعرف أن هذا هو رمز تشغيل إلا إذا "# ifdef __FAVOR_BSD". هو من /usr/include/netinet/tcp.h

# ifdef __FAVOR_BSD
typedef u_int32_t tcp_seq;
/*
 * TCP header.
 * Per RFC 793, September, 1981.
 */
struct tcphdr
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top