послать ARP запрос и получить ответ.
От: vnevsky2006  
Дата: 12.03.06 13:33
Оценка:
Всем привет, есть вопрос.

пишу программу хост монитора для Linux на C++. Задача тривиальная — пинговать все хосты (1500+) и фиксировать время отклика в БД. Пинговать надо ARP запросами (ARP REQUEST).

Все бы хорошо, но не могу принять ответ на мой запрос.
Может кто знает где грабли?


int send_packet(u_char *dev, u_char *packet, u_int packetsize)
{
  struct sockaddr addr;
  int sock, n;

  if( (strlen(dev) == 0) ||
      (packetsize == 0) )
    return -1;

  // Create socket descriptor
  if((sock = socket(AF_INET,SOCK_TYPE,htons(ETH_P_ALL))) < 0) {
      perror("socket");
      exit(1);
  }

  // Set dev and send the packet
  strncpy(addr.sa_data,dev,sizeof(addr.sa_data));
  if((sendto(sock,packet,packetsize,0,&addr,sizeof(struct sockaddr))) < 0) {
      perror("send");
      exit(1);
  }

  close(sock);
  return 0;
}

int send_arp(dev, sip, dip, smac, dmac) {
  int uid;
  unsigned int packetsize = sizeof(struct arphdr) + sizeof(struct ether_header);
  unsigned char packet[packetsize];
  struct ether_header *ethhdr = (struct ether_header *)packet;
  struct arphdr *arp = (struct arphdr *)(packet + sizeof(struct ether_header));
  u_short op;

  // Are you root?
  uid = getuid();
  if(uid != 0)
  {
    printf("You must be a root. Your UID = %d.\n",uid);
    exit(1);
  }

  memset(packet,0,packetsize);
  op = ARPOP_REQUEST;

  memcpy(ethhdr->ether_dhost,(u_char *)ether_aton(dmac),ETHER_ADDR_LEN);
  memcpy(ethhdr->ether_shost,(u_char *)ether_aton(smac),ETHER_ADDR_LEN);
  ethhdr->ether_type = htons(ETHERTYPE_ARP);

  arp->hw_type = htons(ARPHDR_ETHER);
  arp->proto_type = htons(ETH_P_IP);
  arp->ha_len = ETH_ALEN;
  arp->pa_len = IP_ALEN;
  arp->opcode = htons(op);
  memcpy(arp->source_add,(u_char *)ether_aton(smac),ETH_ALEN);
  *(u_long *)arp->source_ip = inet_addr((char *)sip);
  if(strcmp((char *)dmac,"ff:ff:ff:ff:ff:ff"))
    memcpy(arp->dest_add,(u_char *)ether_aton((char *)dmac),ETH_ALEN);

  *(u_long *)arp->dest_ip = inet_addr((char *)dip);

  send_packet((char *)dev,packet,packetsize);
}

int main(int argc, char *argv[]){
// sip - source IP
// dip = Dest IP
// mac - source MAC
// dev - dev

  send_arp(dev, sip, dip, mac, "ff:ff:ff:ff:ff:ff");
}


теперь, как я понимаю надо принять ответ, но как это сотворить не знаю.
Очень нехочется использовать pcap или подобные библиотечки, хочется познать мощ сокетов.

HELP!!!!!!!!!!!!!!!
Re: послать ARP запрос и получить ответ.
От: Kemm  
Дата: 12.03.06 21:08
Оценка:
Здравствуйте, vnevsky2006, Вы писали:

[skip]
qrping
Re[2]: послать ARP запрос и получить ответ.
От: vnevsky2006  
Дата: 13.03.06 07:57
Оценка:
Здравствуйте, Kemm, Вы писали:

K>Здравствуйте, vnevsky2006, Вы писали:


K>[skip]

K>qrping

Оно то да, но это libnet, а я не хочу использовать не libnet, не pcap.
Re[3]: послать ARP запрос и получить ответ.
От: ToShAz  
Дата: 13.03.06 08:12
Оценка:
Hello vnevsky2006,

> Здравствуйте, Kemm, Вы писали:

>
K>> Здравствуйте, vnevsky2006, Вы писали:
K>>
K>> [skip]
K>> qrpi<br />
<span class='lineQuote level2'>K&gt;&gt; ng</span>

> Оно то да, но это libnet, а я не хочу использовать не libnet, не pcap.
Думаю тогда прийдется посмотреть их исходники и выдрать необходимые куски.
Posted via RSDN NNTP Server 2.0
Re[4]: послать ARP запрос и получить ответ.
От: vnevsky2006  
Дата: 13.03.06 08:41
Оценка:
Здравствуйте, ToShAz, Вы писали:

TSA>Hello vnevsky2006,


>> Здравствуйте, Kemm, Вы писали:

>>
K>>> Здравствуйте, vnevsky2006, Вы писали:
K>>>
K>>> [skip]
K>>> qrpi<br />
<span class='lineQuote level3'>K&gt;&gt;&gt; ng</span>

>> Оно то да, но это libnet, а я не хочу использовать не libnet, не pcap.
TSA>Думаю тогда прийдется посмотреть их исходники и выдрать необходимые куски.

Может кто знает arping без libnet и pcap?
Глянуть бы его исходничек.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.