Improved network encoding conversion functions

Now uses optimised/inbuilt functions if available.
This commit is contained in:
Fred Nicolson 2018-03-26 17:34:00 +01:00
parent 4207468ef0
commit c0d103da14
2 changed files with 26 additions and 10 deletions

View File

@ -21,10 +21,14 @@
#include <ws2tcpip.h> #include <ws2tcpip.h>
#define SOL_TCP SOL_SOCKET #define SOL_TCP SOL_SOCKET
#define SHUT_RDWR SD_BOTH #define SHUT_RDWR SD_BOTH
#define UNUSED_VAR
#else #else
#ifdef __GNUC__
#define UNUSED_VAR __attribute__ ((unused)) #define UNUSED_VAR __attribute__ ((unused))
#else
# define UNUSED_VAR
#endif
#define closesocket(x) close(x) #define closesocket(x) close(x)
#define INVALID_SOCKET 0 #define INVALID_SOCKET 0
#define SOCKET_ERROR (-1) #define SOCKET_ERROR (-1)
@ -36,15 +40,27 @@
#include <netinet/tcp.h> #include <netinet/tcp.h>
#endif #endif
#undef htonll #undef htonll
#undef ntohll #undef ntohll
#undef htonf #undef htonf
#undef ntohf #undef ntohf
#undef htond #undef htond
#undef ntohd #undef ntohd
#define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
#define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32)) #if defined(__GNUC__)
# if __BYTE_ORDER == __LITTLE_ENDIAN
# define htonll(x) __bswap_64 (x)
# define ntohll(x) __bswap_64 (x)
# else
# define htonll(x) (x)
# define ntohll(x) (x)
# endif
#elif defined(_MSC_VER)
//MSVC has htonll and ntohll, no need to redefine
#else
# define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
# define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
#endif
inline float htonf(float val) inline float htonf(float val)
{ {
@ -105,7 +121,7 @@ inline bool set_unix_socket_blocking(int32_t socket_descriptor, bool is_blocking
return true; return true;
} }
static UNUSED_VAR void init_wsa() static void init_wsa()
{ {
#ifdef _WIN32 #ifdef _WIN32
static WSADATA wsaData = WSAData(); static WSADATA wsaData = WSAData();

View File

@ -14,7 +14,7 @@ constexpr bool is_little_endian()
TEST(NetworkEncodingTest, test_htonf) TEST(NetworkEncodingTest, test_htonf)
{ {
float input = std::numeric_limits<float>::max(); float input = std::numeric_limits<float>::max() - 50;
float result = htonf(input); float result = htonf(input);
if(is_little_endian()) if(is_little_endian())
@ -31,7 +31,7 @@ TEST(NetworkEncodingTest, test_htonf)
TEST(NetworkEncodingTest, test_ntohf) TEST(NetworkEncodingTest, test_ntohf)
{ {
float input = std::numeric_limits<float>::max(); float input = std::numeric_limits<float>::max() - 50;
float encoded = htonf(input); float encoded = htonf(input);
float decoded = ntohf(encoded); float decoded = ntohf(encoded);
ASSERT_EQ(input, decoded); ASSERT_EQ(input, decoded);
@ -39,7 +39,7 @@ TEST(NetworkEncodingTest, test_ntohf)
TEST(NetworkEncodingTest, test_htond) TEST(NetworkEncodingTest, test_htond)
{ {
double input = std::numeric_limits<double>::max(); double input = std::numeric_limits<double>::max() - 50;
double result = htond(input); double result = htond(input);
if(is_little_endian()) if(is_little_endian())
@ -64,7 +64,7 @@ TEST(NetworkEncodingTest, test_ntohd)
TEST(NetworkEncodingTest, test_htonll) TEST(NetworkEncodingTest, test_htonll)
{ {
uint64_t input = std::numeric_limits<uint64_t>::max(); uint64_t input = std::numeric_limits<uint64_t>::max() - 50;
uint64_t result = htonll(input); uint64_t result = htonll(input);
if(is_little_endian()) if(is_little_endian())
@ -81,7 +81,7 @@ TEST(NetworkEncodingTest, test_htonll)
TEST(NetworkEncodingTest, test_ntohll) TEST(NetworkEncodingTest, test_ntohll)
{ {
uint64_t input = std::numeric_limits<uint64_t>::max(); uint64_t input = std::numeric_limits<uint64_t>::max() - 50;
uint64_t encoded = htonll(input); uint64_t encoded = htonll(input);
uint64_t decoded = ntohll(encoded); uint64_t decoded = ntohll(encoded);
ASSERT_EQ(input, decoded); ASSERT_EQ(input, decoded);