2

私はC++で低レベルのソケットを学んでいます。ARP要求を送信する簡単なプログラムを実行しました。ソケットはパケットを送信しているようですが、Wiresharkでキャッチできません。ARPパケットを送信する別の小さなプログラムがあり、それらのパケットはWiresharkによってキャプチャされます(以下の私のプログラムはそのプログラムに触発されています)。

私は何か間違ったことをした?

削除されたコード

編集

削除されたコード

編集2
パケットにイーサネットヘッダーデータも含める必要があるようです。そこで、イーサネットヘッダーとARPヘッダーデータを含むパケットを作成します。これでパケットは消え、Wiresharkによってキャプチャされます。しかし、Wiresharkはそれが無償であると言います。ご覧のとおり、送信者と受信者のIPアドレスまたはMACアドレスも正しく設定されていないようです。

36  13.318179   Cimsys_33:44:55 Broadcast   ARP 42  Gratuitous ARP for <No address> (Request)


編集3

    /*Fill arp header data*/
    p.arp.ea_hdr.ar_hrd = htons(ARPHRD_ETHER); 
    p.arp.ea_hdr.ar_pro = htons(ETH_P_IP); 
    p.arp.ea_hdr.ar_hln = ETH_ALEN;            // Must be pure INTEGER, not called with htons(), as I did
    p.arp.ea_hdr.ar_pln = 4;                   // Must be pure INTEGER, not called with htons(), as I did
    p.arp.ea_hdr.ar_op = htons(ETH_P_ARP);
4

2 に答える 2

3

このコードはあまり正しくありません。

struct in_addr *s_in_addr = (in_addr*)malloc(sizeof(struct in_addr));
struct in_addr *t_in_addr = (in_addr*)malloc(sizeof(struct in_addr));

s_in_addr->s_addr = inet_addr("192.168.1.5");  // source ip
t_in_addr->s_addr = inet_addr("192.168.1.6");  // target ip

memcpy(arp->arp_spa, &s_in_addr, 6);
memcpy(arp->arp_tpa, &t_in_addr, 6);

memcpyYou care で 6 バイトをコピーします。ただし、ポインター型のアドレスを取得しているため、ポインター型へのポインターになります。s_in_addrと を渡すつもりだったと思いますt_in_addr

編集: Alan Curry は、長さが 4 バイトしかないオブジェクトとの間で 6 バイトをコピーしていることに注意しています。

ただし、動的割り当てがコードをうまく行っているようには見えません。スタックから変数s_in_addrと変数を作成するだけです。それよりも、コードt_in_addrを変更する必要はありません。memcpy

struct in_addr s_in_addr;
struct in_addr t_in_addr;

s_in_addr.s_addr = inet_addr("192.168.1.5");  // source ip
t_in_addr.s_addr = inet_addr("192.168.1.6");  // target ip

memcpy(arp->arp_spa, &s_in_addr, sizeof(arg->arp_spa));
memcpy(arp->arp_tpa, &t_in_addr, sizeof(arg->arg_tpa));

arpパケット自体にも同様の問題があります。したがって、スタックから割り当てる必要があります。多くのコード変更を行わないようにするために、少し異なる方法で説明します。

struct ether_arp arp_packet;
struct ether_arp *arp = &arp_packet;
//...
for(int i = 0; i < 10; i++) {
    if (sendto(sock, arp, sizeof(arp_packet), 0,
               (struct sockaddr *)&sending_socket,
               sizeof(sending_socket)) < 0) { 
        std::cout << "Could not send!" << std::endl; 
    }
}
于 2012-08-24T16:07:39.137 に答える
1

@ user315052は、使用する必要があると言いますmemcpy(arp->arp_spa, &s_in_addr, sizeof(arg->arp_spa));が、このコードは最初の4バイトをコピーするだけでs_in_addrarp->arp_spa絶対に何もしません! だからこれを試してください:

* (int32_t*) arp->arp_spa = inet_addr("192.168.1.1")
* (int32_t*) arp->arp_tpa = inet_addr("192.168.1.2")
于 2012-08-30T06:02:20.457 に答える