1

一部の関数が正しくコンパイルされないという問題が発生しています。これらは、ネットワーク プログラミングがどのように機能するかをよりよく理解し、RAW ソケットを使用して信頼性の高い TCP 接続 (3 ウェイ ハンドシェイク) をまとめることができるかどうかを確認するために、サンプル プログラムからほとんど借りてきたものです。これらは関数です:

void recieve(u_char *args, const struct pcap_pkthdr *pkthdr, const u_char *buffer)

{

const int one = 1;

u_char *ptr;

int LEN = args;   /* FIRST WARNING POINTS HERE */

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 recieved. ACK number: %d\n", ntohl (tcp->tcph_seqnum));

printf("Packet recieved. 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);   /* SECOND WARNING POINTS HERE */   

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, recieve, (u_char *)dl_len) < 0) { /* LAST WARNING HERE */

    fprintf(stderr, "cannot get raw packet: %s\n", pcap_geterr(pd));

    exit(1);

}

}

これらはエラーメッセージです:

In function ‘recieve’:
warning: initialization makes integer from pointer without a cast
In function ‘capture’:
warning: initialization makes pointer from integer without a cast
Warning: cast to pointer from integer of different size

サンプルプログラムでも最初と最後の警告が出ます。これらの 2 つの機能は適切ですか? また、目的を達成するためのよりシンプルでクリーンな方法はありますか? そうでない場合、これらの警告を取り除くにはどうすればよいですか? ありがとう :)

4

2 に答える 2

2

u_charは標準タイプではありません。同等のものは、C99標準の一部であるuint8_tです。多かれ少なかれ最初のエラーを試してみてください、

int LEN = * args

uint8_tはライブラリstdint.hで定義されています

2番目のエラーの場所で、次の手順を実行します。

`char * s =" ip dest host ";

char *filter = (char *)malloc(strlen(s) + strlen(dstip) + 1);
strcpy(filter,s);
strcat(filter,dstip);'

文字列関数strlen、strcpy、strcatに含めてください。

于 2012-07-30T17:40:23.420 に答える
1

まあ、警告は正しいです-でrecieve()、最初の引数はu_char *argsであり、フラグを立てた行では、に割り当てようとしargsていint LENます; argsは ではなく、intに変換することを明示的に要求していないintため、コンパイラはそれについて警告します。

dstip2番目のものについては、投稿したコードに宣言/定義が含まれていないため、タイプが何であるかはわかりませんが、それが ではない場合char *、2番目のメッセージが説明されます。

3 つ目については、渡された代わりに何pcap_loop()が期待されているかを知る必要がありu_char *ますが、それもおそらく不一致です。

于 2012-07-30T17:58:01.477 に答える