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

即使在示例程序中,我也会收到第一个和最后一个警告。这两个功能有什么好处吗?是否有更简单、更清洁的方法来实现它们的目的?如果没有,我应该怎么做才能摆脱这些警告?谢谢 :)

4

2 回答 2

2

u_char 不是标准类型。等效的是 uint8_t,它是 C99 标准的一部分。或多或少第一个错误请尝试,

int LEN = *args

uint8_t 在库 stdint.h 中定义

在第二个错误位置,执行以下操作,

`char *s = "ip 目标主机";

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,并且在您标记的行中,您正试图分配argsint LEN; argsis not an int,并且您没有明确要求将其转换为 an int,因此编译器会发出警告。

对于第二个,我不确定是什么类型dstip,因为声明/定义不包含在您发布的代码中,但如果它不是 a char *,那将解释第二条消息。

对于第三个,我必须知道pcap_loop()期望什么代替u_char *你通过它,但这也可能是不匹配的。

于 2012-07-30T17:58:01.477 回答