#c #sockets #network-programming
#c #сокеты #сетевое программирование
Вопрос:
Я создаю демонстрацию, чтобы доказать, что сетевой порядок байтов такой же, как и big endian:
#include "stdio.h"
#include "stdint.h"
#include "winsock2.h"
#define BL32(x) ((((x) amp; 0x000000ffUL) << 24) |
(((x) amp; 0x0000ff00UL) << 8) |
(((x) amp; 0x00ff0000UL) >> 8) |
(((x) amp; 0xff000000UL) >> 24))
int main(int argc, char* argv[])
{
uint32_t s = INT_MAX; // little endian
uint32_t network = htonl(s);
uint32_t bigendian = BL32(s);
if(network == bigendian) {
printf("nbo is same as big endiann");
} else {
printf("nbo isn't same as big endiann");
}
return 0;
}
Эта программа работает на ПК с ОС Windows x86 (с небольшим конечным порядком) и выдает выходные данные:
nbo is same as big endian
Я не видел, чтобы это упоминалось в учебнике или руководстве, поэтому я хочу подтвердить, правильно это или нет.
Кстати, я думаю, что очень важно помочь понять, что такое порядок байтов в сети. Почему большая часть вопроса сосредоточена только на «большом и маленьком endian»…
Ответ №1:
Да, это так. Вы можете прочитать это в статье Википедии о порядковом порядке
Big-endian является наиболее распространенным форматом в сетях передачи данных; поля в протоколах набора интернет-протоколов, таких как IPv4, IPv6, TCP и UDP, передаются в порядке big-endian. По этой причине порядок байтов в байтах большого порядка также называется сетевым порядком байтов.
Обычно вам не нужно знать, является ли сетевой порядок байтов большим или меньшим порядком. Просто используйте ntohX
htonX
макросы и, и это будет правильно. Если вы используете оборудование, которое имеет тот же порядок байтов, что и сетевые протоколы, оно оставит значение в покое; если вы используете машину с противоположным порядком байтов, оно поменяет байты местами.