1

この警告が表示されます:

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私は少し混乱しています。あなたが言う時:

そのアドレスを渡す必要があり、コールバックの実行時に変数が動的に割り当てられるか、スコープ内にとどまるようにする必要があります。

この例では、それがどのようにコードに変換されるのかわからないので、以下に提案されていることは機能しているように見えますが、コードがずさんなものになることは望んでいません。

4

2 に答える 2

2

この関数は、ユーザーデータへのポインターがコールバック関数に渡されることを期待しています。指定された引数は整数であり、ポインタではありません。コールバックで使用される場合は、メモリアドレスとして解釈されます。これはあなたが望むものではありません。

コールバックにパススルーし、その値を確認できるようにする場合( 14dl_lenのみのように見えます)、そのアドレスを渡す必要があります。また、変数が動的に割り当てられるか、スコープ内にとどまるようにする必要があります。コールバックが実行されます。

そのようにポインタを渡します-:に注意してください&

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

pcap_loop関数についての私の理解は、u_char*がrecieve関数の最初の引数を指しているということです。その場合、なぜ警告が表示されるのですか?

正しい。x64で実行していると思いますが、問題はこのコードにあります(u_char *)dl_len)。int(プラットフォームでは4バイトの可能性が高い)をポインター(プラットフォームでは4バイトの可能性が高い)に変換しようとしています。

ケースの簡単な修正は、タイプをに変更することdl_lenですlong。より好ましい解決策は、に変更(u_char *)dl_len)することreinterpret_cast<char*>(dl_len)です。

この誤ったメモリポインタを無視したくないので、に変更int LEN = *args;する必要もあります。int LEN = args

于 2012-08-15T23:43:12.170 に答える