gpt4 book ai didi

pcap_loop 的最后一个参数中的编译器警告。指向不同大小的整数

转载 作者:可可西里 更新时间:2023-11-01 02:47:21 26 4
gpt4 key购买 nike

我收到这个警告:

cast to pointer from integer of different size

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

我对pcap_loop函数的理解是u_char *指向recieve函数的第一个参数对吧?如果是这样,为什么要收到警告?

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

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 我有点困惑。当你说:

you'll need to pass it's address, and make sure that the variable is dynamically allocated or remains in scope >when the callback executes.

恐怕我不确定如何将其转化为本示例中的代码,而且我不希望代码草率,尽管下面的建议似乎可行。

最佳答案

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

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

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

if (pcap_loop(pd, -1, receive, (u_char *) &dl_len) < 0) 

关于pcap_loop 的最后一个参数中的编译器警告。指向不同大小的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11978705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com