linux主机序与网络序的转换

在网络通信中,经常用到字节序转换,实际上内核已经帮我们实现了两套通用的转序宏定义,但是在转换过程中,都是进行主继续与网络序的转换,代码难免冗余,我们可以根据已经提供的特性,来添加一些执行规则,这样就可以用一个转序函数实现两种转序,例如,htonl,既可以实现原htonl的功能,也实现了ntohl的功能,不用写两套转换函数,只需要将转序函数重新定义一个名字就可以。定义如下,未实测。

实现的规则就是主机序是大字节序的不转换字节序,保持原序,主机序是小字节序的转为网络序,即大字节序。

#ifndef _MY_BYTE_SWAP_H_
#define _MY_BYTE_SWAP_H_

#ifdef __cplusplus             //告诉编译器,这部分代码按C语言的格式进行编译,而不是C++的
extern "C"{
#endif

#ifdef __KERNEL_
#ifndef _ASM_BYTEORDER_H
#include 
#endif

#define htonl(x) __htonl(x)
#define ntohl(x) __ntohl(x)
#define htons(x) __htons(x)
#define ntohs(x) __ntohs(x)

#define ntoh64(x) __be64_to_cpu(x)  /* 内核根据CPU实现 */
#define hton64(x) __cpu_to_be64(x)

#else   /*NOT KERNEL */
#ifndef _ENDIAN_H
#include
#endif
#ifndef _BYTESWAP_H
#include 
#endif
#if (__BYTE_ORDER == __LITTLE_ENDIAN)
#define ntohs(x)    __bswap_16(x)
#define htons(x)    __bswap_16(x)
#define htonl(x)    __bswap_32(x)
#define ntohl(x)    __bswap_32(x)
#define ntoh64(x)   __bswap_64(x)
#define hton64(x)   __bswap_64(x)
#else
#define ntohs(x)    x
#define htons(x)    x
#define htonl(x)    x
#define ntohl(x)    x
#define ntoh64(x)   x
#define hton64(x)   x
#endif
#endif






#ifdef __cplusplus
}
#endif

#endif/* _MY_BYTE_SWAP_H_ */



 

你可能感兴趣的:(C,linux)