2012-07-30 23 views
1

我遇到了一些编译不正常的问题。他们几乎从示例程序中借用,以便更好地了解网络编程的工作方式,并查看是否可以使用RAW套接字组合可靠的TCP连接(三次握手)。这些都是功能:tcp原始程序中的PCAP函数。

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 

我得到的第一个和最后的警告,甚至在示例程序。这两个功能是否有用,是否有更简单更清晰的方法来实现它们的目的?如果不是,我该怎么办才能摆脱这些警告?谢谢:)

+1

拼写错误“收到”。 – 2012-07-30 19:49:23

回答

2

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

INT LEN = * ARGS

uint8_t中定义的库stdint.h

在第二个错误的地方,做到以下几点,

` char * s =“ip dest host”;

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

请包括字符串函数strlen,strcpy和strcat。

1

那么,警告是正确的 - 在​​,第一个参数是u_char *args,并在你标记的线,你正试图分配argsint LEN; args不是int,并且您没有明确要求将其转换为int,因此编译器会对此提出警告。

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

对于第三个,我必须知道pcap_loop()预期会取代您传递的u_char *,但这可能也是不匹配的。