linuxホストシーケンスとネットワークシーケンスの変換
ネットワーク通信では、バイトシーケンスの変換がよく使われていますが、実際にカーネルは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_ */