この警告が表示されます:
cast to pointer from integer of different size
プログラムをコンパイルしようとしたとき。この特定のコードは、TCP接続プログラムの例からかなり持ち上げられており、私は単なる趣味のプログラマーなので、解決策は非常に明白だと思いますが、それでも私は怒っています。
pcap_loop関数についての私の理解は、recieve関数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私は少し混乱しています。あなたが言う時:
そのアドレスを渡す必要があり、コールバックの実行時に変数が動的に割り当てられるか、スコープ内にとどまるようにする必要があります。
この例では、それがどのようにコードに変換されるのかわからないので、以下に提案されていることは機能しているように見えますが、コードがずさんなものになることは望んでいません。