我收到此警告:
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 我有点困惑。当你说:
您需要传递它的地址,并确保变量是动态分配的或保持在范围内>回调执行时。
恐怕我不确定在此示例中如何将其转换为代码,并且我不希望代码马虎,尽管下面的建议似乎可行。