хост в сеть двойной? - PullRequest
5 голосов
/ 22 мая 2011

Я хотел бы отправить несколько чисел с плавающей запятой двойной точности по сети. (стандартный C, стандартные сокеты) Нет htond или ntohd для преобразования данных в сетевой порядок байтов и из него. Что я должен делать? У меня есть пара решений в моей голове, но я хотел бы знать, какова общая практика.

(я также хотел бы знать, какова обычная практика отправки 64-битных целочисленных значений, например значений gint64, используемых gstreamer)

редактировать: Это одно решение, о котором я подумал. Я предполагаю, что это работает для целых чисел любого размера, но правильно ли это для двойных чисел?

void swap_if_necessary (void* buff, int buff_len) 
{
    uint32_t foo = 1;
    if ( htonl(foo) != foo ) 
    {
        char* to_swap = (char*)buff;

        int i;
        for (i = 0; i < buff_len/2; i++)
        {
            char  swap_buff = to_swap[i];
            to_swap[i] = to_swap[buff_len -1 -i];  
            to_swap[buff_len -1 -i] = swap_buff;
        }  
    }
}

Ответы [ 3 ]

10 голосов
/ 22 мая 2011

Преобразуйте его в согласованный формат строки и отправьте его. Не уверен, что это обычная практика или даже приличная, но она сработала для меня (правда, в тот момент я не заботился о производительности, поскольку не отправлял очень много значений).

5 голосов
/ 22 мая 2011

Что говорит Андре, так это то, что двоичные числа с плавающей запятой не заслуживают доверия в сетях из-за различий между различными компьютерными архитектурами. Различия, которые выходят за пределы порядка байтов (big / little endian). Таким образом, такие вещи, как преобразование в строки или использование таких библиотек, как XDR, действительно необходимы, если есть вероятность того, что ваши данные будут обрабатываться различными компьютерными архитектурами.

Простые форматы целых чисел и символов могут проскальзывать только с помощью порядкового номера, но с плавающей точкой становится все сложнее.

4 голосов
/ 22 мая 2011

Возможно, вы захотите взглянуть на XDR , который был впервые определен в rfc1014 .Очевидно, вы хотите найти библиотеку, которая реализует XDR для вашей платформы.

...