linuxホストシーケンスとネットワークシーケンスの変換

1465 ワード

ネットワーク通信では、バイトシーケンスの変換がよく使われていますが、実際にカーネルは2つの一般的なシーケンスマクロ定義を実現しています.しかし、変換の過程で、主継続とネットワークシーケンスの変換を行います.コードは冗長性を避けられません.私たちはすでに提供された特性に基づいて、いくつかの実行規則を追加することができます.そうすれば、1つのシーケンス関数で2つのシーケンスを実現することができます.例えば、htonlは、元のhtonlの機能も実現でき、ntohlの機能も実現でき、2つの変換関数を書く必要はなく、シーケンス関数を1つの名前を再定義するだけでよい.以下のように定義され、実測されていない.
実装されるルールは、ホストシーケンスが大バイトシーケンスの非変換バイトシーケンスであり、元のシーケンスを維持し、ホストシーケンスが小バイトシーケンスのネットワークシーケンス、すなわち大バイトシーケンスに移行することである.
#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_ */