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_addrand t_in_addr

编辑: Alan Curry 指出,您正在从只有 4 个字节长的对象之间复制 6 个字节。

但是,动态分配似乎对您的代码没有任何好处,您应该从堆栈中创建s_in_addrand变量。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_addr到那arp->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 回答