歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Unix網絡字節順序及其判斷

Unix網絡字節順序及其判斷

日期:2017/2/28 16:17:59   编辑:Linux教程

一:對於一個16字節的數據,比如0x0102,在內存中可以有兩個方式來存貯。一種是0x0102,一種是0x0201,前者成為小段對其,後者成為大端對齊。

在網絡編程中,需要考慮到網絡數據的存儲順序問題,這是個很重要的問題。因為客戶機的數據存儲順是不統一好的,比如Linux,Windows用的是小段對齊,BSD,AIX等Unix系統用的時大端對齊。如果要在不同容的許同上交換數據就必須考慮這個數據格式的問題。

在Linux/Unix中,通常的數據在堆中存儲,堆的內存地址是有高到底編址的,這和棧的地址順序相反。在硬件中,一般的地址順序為,從右到左,遞增。

所以,這個大小端可以,統一為左邊為大端,右邊為小端。

所以,小段對齊,即先存儲小段數據,拿0x0102來說,的地址順序為:0102,大端對齊的地址順序為:0201.

下面有一個例子來判斷大小斷對齊:

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. int byte_order(void);
  4. int main(int argc,char *argv[])
  5. {
  6. int val =0;
  7. val = byte_order();
  8. printf("%d\n",val);
  9. }
  10. int byte_order(void)
  11. {
  12. int val;
  13. union
  14. {
  15. short s;
  16. char c[sizeof(short)];
  17. }un;
  18. un.s = 0x0102;
  19. if(sizeof(short) == 2)
  20. {
  21. if((un.c[0] == 1) && (un.c[1] == 2))
  22. {
  23. val = 1;/* big-endian */
  24. }
  25. else if((un.c[0] == 2) && (un.c[1] == 1))
  26. {
  27. val = 0;/*little-endian*/
  28. }
  29. else
  30. {
  31. val = 2;/* unknown */
  32. }
  33. }
  34. else
  35. {
  36. printf("sizeof(short) = %d\n", sizeof(short));
  37. val = -1;/*the size of short is not 1 byte,type nuknown.*/
  38. }
  39. return val;
  40. }

在gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC)下結果為0:小段對齊。

二:在網絡編程中,可以使用以下函數來轉換網絡順序:

#include <netinet/in.h>
uint16_t htons(uint16_t host16bitvalue) ;
uint32_t htonl(uint32_t host32bitvalue) ;
Both return: value in network byte order
uint16_t ntohs(uint16_t net16bitvalue) ;
uint32_t ntohl(uint32_t net32bitvalue) ;
Both return: value in host byte order

n表示net(網絡順序),h表示host(本機順序),s表示short,16bit;l表示long,32bit.
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/Harry_lyc/archive/2011/04/08/6310031.aspx

Copyright © Linux教程網 All Rights Reserved