Если у вас есть строка без знака char array (вдоль линий "10.0.0.7"
), формирующая IP-адрес (и я предполагаю, что вы это делаете, поскольку 32-битных char
систем очень мало вокруг, что делает довольно сложным сохранение IP-адреса в один символ), вы можете просто отправить его как есть и позволить другому концу использовать его (при условии, что вы, конечно, оба кодируете символы одинаково, например, в ASCII) .
С другой стороны, у вас может быть четырехбайтовый массив символов (предполагая, что символы - это восемь битов), содержащий двоичный IP-адрес.
Использование htonl
и ntohl
должно гарантировать, что эти двоичные данные отправляются в порядке, понятном как для систем с прямым порядком байтов, так и для систем с прямым порядком байтов.
С этой целью сетевой порядок байтов (порядок байтов "на проводе") имеет порядок с прямым порядком байтов, поэтому эти функции в основном не делают ничего с системами с прямым порядком байтов. В системах с прямым порядком байтов они обмениваются байтами.
Другими словами, у вас могут быть следующие двоичные данные:
uint32_t ipaddress = 0x0a010203; // for 10.1.2.3
В макете с прямым порядком байтов, который будет храниться как 0x0a,0x01,0x02,0x03
, в формате с прямым порядком байтов как 0x03,0x02,0x01,0x0a
.
Итак, если вы хотите отправить его в порядке сетевых байтов (что любая система с прямым порядком байтов сможет понять), вы не можете просто сделать:
write (fd, &ipaddress, 4);
с тех пор, как послать это из системы с прямым порядком байтов в систему с прямым порядком байтов, в итоге байты будут инвертированы.
Что вам нужно сделать, это:
uint32_t ipaddress = 0x0a010203; // for 10.1.2.3
uint32_t ip_netorder = htonl (ipaddress); // change if necessary.
write (fd, &ip_netorder, 4);
Это означает, что это будет сетевой порядок байтов, который может понять любая программа на другом конце (при условии, что она использует ntohl
, чтобы убедиться, что она верна для своих целей).
На самом деле, эта схема может обрабатывать больше, чем просто порядковый номер. Если у вас есть схема 32-битного целочисленного кодирования, где ABCD
(четыре байта) кодируются как A,D,B,C
или даже там, где у вас есть странно дикая битовая смесь, формирующая ваши целые числа (например, используя сначала четные биты, а затем нечетные биты), это будет все еще работает, поскольку ваши локальные htonl
и ntohl
знают об этих форматах и могут правильно преобразовать их в сетевой порядок байтов.