2017-06-17 17 views
0

私のデータ構造(インターネットパケットからデータを取得する)にいくつかのメモリを割り当てようとしていましたが、問題に直面しました。最初のループは完全になり、構造体内のすべてのデータは正しいです。ここでは、コードは次のようになります。Reallocは2番目のループでプログラムを停止します

struct ipOut *ipHeadr = NULL; 
    struct ipAddr *addrHeadr = NULL; 
    struct hexOut *hexHeadr = NULL; 
    struct icmpOut *icmpHeadr = NULL; 
    struct igmpOut *igmpHeadr = NULL; 
    struct tcpOut *tcpHeadr = NULL; 
    struct udpOut *udpHeadr = NULL; 

    int main() { 

ipHeadr = (struct ipOut*)malloc(sizeof(ipHeadr)); 
addrHeadr = (struct ipAddr*)malloc(sizeof(addrHeadr)); 
hexHeadr = (struct hexOut*)malloc(sizeof(hexHeadr)); 
icmpHeadr = (struct icmpOut*)malloc(sizeof(icmpHeadr)); 
igmpHeadr = (struct igmpOut*)malloc(sizeof(igmpHeadr)); 
tcpHeadr = (struct tcpOut*)malloc(sizeof(tcpHeadr)); 
udpHeadr = (struct udpOut*)malloc(sizeof(udpHeadr)); 

struct sockaddr saddr; 
unsigned char *buff = (unsigned char *)malloc(65536); 
int sock = socket(AF_INET , SOCK_RAW , IPPROTO_TCP); 
if (sock < 0){ 
    printf ("Error creating socket"); 
    return 1; 
} 
int loop = 1; 
while (loop == 1){ 
    int saddrLength = sizeof saddr; 
    rawData = recvfrom(sock, buff, 65536, 0, &saddr, &saddrLength); 
    printf("raw data %d\n", rawData); 
    if(rawData <0) 
    { 
     printf("Failed to get packets\n"); 
     return 1; 
    } 
    gettingPacket(buff, rawData); 
} 
return 0; 
    } 

    void gettingPacket(unsigned char * buff, int data){ 
packetNum++; 
ipHeadr = (struct ipOut*)realloc(ipHeadr, sizeof(ipHeadr)*packetNum); 
addrHeadr = (struct ipAddr*)realloc(addrHeadr,sizeof(addrHeadr)*packetNum); 
hexHeadr = (struct hexOut*)realloc(hexHeadr, sizeof(hexHeadr)*packetNum); 
struct iphdr *iph = (struct iphdr*)buff; 


switch (iph -> protocol) 
{ 
    case 1: 
     icmpNum++; 
     icmpHeadr = (struct icmpOut*)realloc(icmpHeadr, sizeof(icmpHeadr)*icmpNum); 
     icmpOutput(buff, data); 
     hexDataOut(buff, data); 
     break; 
    case 2: 
     igmpNum++; 
     igmpHeadr = (struct igmpOut*)realloc(igmpHeadr,sizeof(igmpHeadr)*igmpNum); 
     igmpOutput(buff, data); 
     hexDataOut(buff, data); 
     break; 
    case 6: 
     tcpNum++; 
     tcpHeadr = (struct tcpOut*)realloc(tcpHeadr,sizeof(tcpHeadr)*tcpNum); 
     tcpPacketOutput(buff, data); 
     hexDataOut(buff, data); 
     break; 
    case 17: 
     udpNum++; 
     udpHeadr = (struct udpOut*)realloc(udpHeadr, sizeof(udpHeadr)*udpNum); 
     udpPacketOutput(buff, data); 
     hexDataOut(buff, data); 
     break; 

} 
    } 

デバッグは、そのコードは、このライン上に停止伝えます:

ipHeadr = (struct ipOut*)realloc(ipHeadr, sizeof(ipHeadr)*packetNum); 

私は、メモリリークがどこかにあると思いますが、私はそれを見つける傾けます。

+2

ヒント 'type * pointer = malloc(sizeof(* pointer));'、 'sizeof(pointer)'はポインタサイズです。 'sizeof(Type)'または 'sizeof(* pointer)'は型サイズです。 – BLUEPIXY

+0

'malloc'&friendsの結果をキャストしないでください! – Olaf

+0

ありがとう、それは働いて、私はばかです。 ) –

答えて

0

あなたのバッファにはデータが入っていないので、少し役に立たないです。

また、reallocのにお電話で:

icmpHeadr = (struct icmpOut*)realloc(icmpHeadr, sizeof(icmpHeadr) * icmpNum); 
/* the size given above is wrong, sizeof(icmpHeadr) is the size of a pointer. */ 

あなたは一緒に、バッファ内のreallocとデータのコピーを維持する必要があります。例:

void main(..) 
{ 
void* tmp; 

/* no need to initialize your arrays here 
    a NULL value would indicate an empty array */ 

/*...*/ 

    case 1: 
    /* icmpHeadr can be NULL on first call to realloc that's not a problem 
     but realloc could fail if you run out of memory... 
    */ 
    tmp = realloc(icmpHeadr, sizeof(struct icmpOut)*(icmpNum + 1)); 
    if (tmp) 
    { 
     icmpHeadr = (struct icmpOut*)tmp; 
     memcpy(&icmpHeadr[icmpNum], buff, sizeof(struct icmpOut)); 
     ++icmpNum; 
     icmpOutput(buff, data); 
     hexDataOut(buff, data); 
    } 
    else 
    { 
     /* you've ran out of memory 
     You could keep counting icmp messages 
     but that would mess your array size, in case memory 
     becomes available later. 

     ...or you could simply exit your app. Avoiding running out of 
     memory would necessitate a major rewrite of your app, anyway. 
     */ 
    } 
    break; 
関連する問題