1

我收到此警告:

cast to pointer from integer of different size

尝试编译我的程序时。这段特殊的代码几乎是从一个示例 TCP 连接程序中提取的,我只是一个业余程序员,所以我猜这个解决方案很明显,但它让我发疯。

我对 pcap_loop 函数的理解是u_char *指向接收函数的第一个参数,对吧?如果是这种情况,为什么会收到警告?

因为我不太确定出了什么问题,所以我已经完整地包含了我认为相关的功能,我真的希望你们中的一些人能在这里找到它来帮助我。

void receive(u_char *args, const struct pcap_pkthdr *pkthdr, const u_char *buffer)
{
const int one = 1;
int LEN = *args;        
struct ipheader *ip;
struct tcpheader *tcp;

ip = (struct ipheader *)(buffer + LEN);
tcp = (struct tcpheader *)(buffer + LEN + sizeof (struct ipheader));

printf("%d\n", LEN);

printf("Packet received. ACK number: %d\n", ntohl (tcp->tcph_seqnum));
printf("Packet received. SEQ number: %d\n", nthol (tcp->tcph_acknum));
s_seq = nthol (tcp->tcph_seqnum);

send_syn_ack(s_seq, dip, sip, dport, sport);    

sleep(100);
}

void capture()
{
pcap_t *pd;
bpf_u_int32 netmask;
bpf_u_int32 localnet;
char *filter = ("ip dest host %s", dstip);      
char *dev = NULL;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program filterprog;
int dl = 0, dl_len = 0;

if ((pd = pcap_open_live(dev, 1514, 1, 500, errbuf)) == NULL) 
    {           
        fprintf(stderr, "cannot open device %s: %s\n", dev, errbuf);
        exit(1);
    }

pcap_lookupnet(dev, &localnet, &netmask, errbuf);
pcap_compile(pd, &filterprog, filter, 0, localnet);
if (pcap_setfilter(pd, &filterprog) == - 1)
    {
        fprintf(stderr, "cannot set pcap filter %s: %s\n", filter, errbuf);
        exit(1);
    }

pcap_freecode(&filterprog);
dl = pcap_datalink(pd);

switch(dl) {
    case 1:
        dl_len = 14;
        break;
    default:
        dl_len = 14;
        break;
}       

if (pcap_loop(pd, -1, receive, (u_char *)dl_len) < 0)   /* THIS IS THE LINE IN QUESTION */
    {
        fprintf(stderr, "cannot get raw packet: %s\n", pcap_geterr(pd));
        exit(1);
    }
}

非常感谢你们俩!@pb2q 我有点困惑。当你说:

您需要传递它的地址,并确保变量是动态分配的或保持在范围内>回调执行时。

恐怕我不确定在此示例中如何将其转换为代码,并且我不希望代码马虎,尽管下面的建议似乎可行。

4

2 回答 2

2

该函数需要一个指向用户数据的指针,以传递给回调函数。您提供的参数是整数,而不是指针,如果在回调中使用,它将被解释为内存地址。这不是你想要的。

如果你想传递dl_len给回调,并且能够查看它的值(看起来它只是14),你需要传递它的地址,并确保变量是动态分配的或保持在范围内回调执行。

像这样传递一个指针 - 请注意&

if (pcap_loop(pd, -1, receive, (u_char *) &dl_len) < 0) 
于 2012-08-15T23:45:06.783 回答
1

我对pcap_loop函数的理解是u_char *指向receive函数的第一个参数,对吧?如果是这种情况,为什么会收到警告?

正确的。我想你在 x64 上运行,问题出在这段代码中(u_char *)dl_len)。您正在尝试将一个 int(在您的平台上很可能是 4 个字节)转换为一个指针(在您的平台上很可能是 4 个字节)。

您的情况的快速解决方法是将类型更改dl_lenlong. 更可取的解决方案是更改(u_char *)dl_len)reinterpret_cast<char*>(dl_len).

您还需要更改int LEN = *args;int LEN = args,因为您不想尊重这个错误的内存指针。

于 2012-08-15T23:43:12.170 回答