in_addr со случайными результатами - PullRequest
0 голосов
/ 27 января 2012

Я работаю с библиотекой pcap и пытаюсь захватить IP-адреса источника и назначения, но, похоже, она дает мне совершенно случайные результаты:

Вот моя структура:

struct sniff_ip {
  u_char ip_vhl;
  u_char ip_tos;
  u_short ip_len;
  u_short ip_id;
  u_short ip_off;
  u_char ip_ttl;
  u_char ip_p;
  u_short ip_sum;
  struct in_addr ip_src, ip_dst;
};

Вот соответствующий код, который использует структуру:

void print_payload(u_char *arg, const struct pcap_pkthdr *pkthdr, const u_char *packet)
{
  const struct sniff_ip *ip;
  int i=0;
  static int count=0;

  ip = (struct sniff_ip*)(packet + SIZE_ETHERNET);
  printf("Source [%s]  - Destination [%s]\n", inet_ntoa(ip->ip_src), inet_ntoa(ip->ip_dst));
  printf("Payload:\n");
  for(i=0; i<pkthdr->len; i++)
  {
    if(isprint(packet[i]))
      printf("%c", packet[i]);
    else
      printf(".", packet[i]);
    if((i%16 == 0 && i != 0) || ( i== pkthdr->len-1))
      printf("\n");
  }
}

Вывод:

Source [207.117.127.0]  - Destination [207.117.127.0]
Payload:
................E
..<m4@.@..u.....
.......Q@1......
....0....@......
1\.........
Source [60.190.127.0]  - Destination [60.190.127.0]
Payload:
................E
..(..@.@.<......
...........Q@1.P
...wN..

IP-адреса кажутся совершенно случайными и не мои,Ожидаемый вывод будет показывать мой собственный IP для источника и назначения, так как я тестирую его, подключаясь к себе.Я запускаю его на порту 23. Чтобы никто не вмешивался в другие данные.

Редактировать: у меня все получилось, по какой-то причине мне пришлось по телнету «eth0» вместо «localhost», чтобы он работал.Однако, как только я изменил порт на что-то более полезное, например, порт 80, он работал нормально.Я не уверен, почему порт 23 был другим, ну да ладно.

1 Ответ

3 голосов
/ 27 января 2012

inet_ntoa возвращает указатель на его внутренний буфер, поэтому маловероятно, что вы можете использовать два inet_ntoa s в одном вызове printf и надеяться на разные результаты.

...