Безопасно ли писать байтовый массив без знака в сетевом порядке непосредственно в ip.ip_dest? - PullRequest
0 голосов
/ 24 января 2019

В netinet / ip.h есть структура "ip", которая используется для передачи IP-пакетов. Поля адреса: «ip_src» и «ip_dest».

Если у меня есть IPv4-адреса в сетевом порядке в байтовом массиве без знака, безопасно ли копировать этот массив напрямую в ip_src и ip_dest?

Например, если я отправляю пакет на 23.45.167.92 и у меня есть следующий беззнаковый символ [4]: ​​

destination_ip[0] = 23;
destination_ip[1] = 45;
destination_ip[2] = 167;
destination_ip[3] = 92;

Могу ли я тогда безопасно сделать это:

struct ip my_packet_header;
my_packet_header.ip_dest = *((ip_addr*)destination_ip);

Под «безопасным» я подразумеваю, что он будет работать как на машинах с прямым и младшим порядком байтов.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Помимо порядка байтов существует, по крайней мере, одна проблема: Выравнивание.

struct ip my_packet_header может иметь более строгое требование выравнивания, чем unsigned char destination_ip[]

Указатель на тип объектаможет быть преобразован в указатель на другой тип объекта.Если результирующий указатель неправильно выровнен для ссылочного типа, поведение не определено .C11 §6.3.2.3 7


memcpy() обрабатывает эту проблему и устраняет проблемы @ wildplasser

assert(sizeof my_packet_header >= sizeof destination_ip);
memcpy(&my_packet_header, destination_ip, sizeof destination_ip);

Можно ожидать оптимизирующего компиляторапроанализировать этот memcpy() вызов и создать эффективный код - возможно без истинного вызова функции.

0 голосов
/ 24 января 2019

из man ip

s_addr член struct in_addr содержит адрес интерфейса хоста в сетевом порядке байтов.

Так что вы нормально копируете байты, но лучше использовать memcpy вместо приведения.

memcpy(&my_packet_header.ip_dest.s_addr, destination_ip);
...