sockaddr - выводит всю информацию, которую содержит sa_data - c ++ - PullRequest
4 голосов
/ 16 декабря 2010

в моем приложении c ++ я использую sockaddr. Я хочу увидеть все сведения, которые хранит sockaddr.sa_data [14]. сейчас я просто печатаю ip из sa_data [2] .sa_data [3] .sa_data [4] .sa_data [5].

Я хочу напечатать так, чтобы я мог понять (и, пожалуйста, объясните) всю информацию в байтах sa_data 14.

любая помощь?

спасибо!

Ответы [ 6 ]

5 голосов
/ 16 апреля 2012

В элементе sa_data для IPv4 в Windows я обнаружил, что первые два байта содержат номер порта, а следующие четыре содержат IP-адрес.

Например, если я разрешу адрес 228.0.0.1:9995, членом sa_data является ...

27 0b e4 00 00 01 00 00 00 00 00 00 00 00

Здесь 270b - это представление шестнадцатеричного значения 9995 в первых двух байтах.Следующие четыре байта являются IP-адресом, где 0xe4 равен 228, затем два нуля, затем 0x01 или 228 0 0 1.
Последние восемь байтов не используются, что соответствует приведенному выше комментарию только опервые шесть байтов используются.

Обратите внимание, что sa_data будет различаться по формату в зависимости от используемого протокола.

2 голосов
/ 16 декабря 2010

Одной из возможностей будет использование inet_ntop, которое должно обрабатывать адреса IPv4 и IPv6. Он создаст удобочитаемую строку с адресом.

1 голос
/ 30 апреля 2014

значение sa_data, которое составляет 14 байтов, изменяется (различается) в зависимости от семейства адресов: sa_family.

  1. , если семейство адресов AF_INET, первые два байта являются номером порта, а следующие 4 байта будут IP-адресом источника.

  2. , если семейство адресов PF_PACKET, первые два байта сообщают тип Ethernet (с 0800 -> IP, 0806 -> ARP и т. Д.) И следующие 4 байта (на самом деле первого достаточно), это говорит об интерфейсе источника.если значение:

    • 02 00 00 00 = eth0,
    • 03 00 00 00 = eth1,
    • 04 00 00 00 = eth2 и т. д.и последние 8 байтов не используются в семействе AF_INET, но в PF_PACKET я не обнаружил.
0 голосов
/ 02 октября 2015

Чтобы получить и напечатать sa_data member из struct sockaddr, обратитесь к ответу Джона по адресу Получение адреса IPV4 из структуры sockaddr

0 голосов
/ 16 декабря 2010

Информация в sockaddr зависит от того, какое семейство сокетов и протокол вы используете.

Если вы используете IPv4, правильнее всего привести указатель sockaddr к sockaddr_in *. Только первые 6 байтов адреса имеют смысл при использовании IPv4. Остальные должны быть просто проигнорированы.

0 голосов
/ 16 декабря 2010
std::copy( &sa_data[0], &sa_data[0]+sizeof(sa_data)/sizeof(sa_data[0]), 
             std::ostream_iterator<int>(std::cout, " "));

будет печатать каждый элемент как целое с разделением пробела.Вы также можете использовать unsigned int, если вам не нужны отрицательные значения, и вы можете iomanip вашего потока вывести в шестнадцатеричном формате, если вы предпочитаете это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...