2012-07-30 1 views
1

제대로 컴파일되지 않는 일부 기능에 문제가 있습니다. 그것들은 네트워크 프로그래밍이 어떻게 작동하는지 더 잘 이해하고 RAW 소켓을 사용하여 안정적인 TCP 연결 (3 way handshake)을 구성 할 수 있는지를보기 위해 예제 프로그램에서 꽤 많이 빌려 왔습니다.PCAP는 TCP 원시 프로그램의 기능을합니다.

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

"수신"의 철자가 잘못되었습니다. –

답변

2

u_char는 표준 유형이 아닙니다. 등가물은 C99 표준의 일부인 uint8_t입니다. 더 많거나 적은 첫 번째 오류가보십시오,

INT LEN = * 인수

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

음, 경고가 올바른지 - recieve()에서, 첫 번째 인수는 u_char *args, 당신이 플래그 라인, 당신은 int LENargs를 할당하려고합니다; argsint이 아니며 컴파일러가 int으로 변환하도록 명시 적으로 요청하지 않았습니다. 선언/정의가 당신이 게시 코드에 포함되지 않기 때문에 두 번째를 들어

, 나는 어떤 유형 dstip 모르겠지만,이 char *를 아니라면, 그 두 번째 메시지를 설명 할 것입니다.

세 번째로, 나는 u_char * 대신에 pcap_loop()이 무엇을 기대하고 있는지 알고 있어야합니다.하지만 그 역시 불일치 일 수 있습니다.