2013-03-06 85 views
0

我的程序捕獲來自互聯網的網絡流量以分析數據包的模糊性。我正在使用winPcap庫。現在我想程序運行2分鐘&自動退出程序,無需手動關閉命令提示符控制檯。你能否提供我這樣做的代碼。 謝謝如何在執行特定時間後退出主函數C

代碼如下:

int main() 
{ 
    u_int i, res , inum ; 
    u_char errbuf[PCAP_ERRBUF_SIZE] , buffer[100]; 
    u_char *pkt_data; 
    time_t seconds; 
    struct tm tbreak; 
    pcap_if_t *alldevs, *d; 
    pcap_t *fp; 
    struct pcap_pkthdr *header; 

    fopen_s(&logfile , "log.txt" , "w"); 

    if(logfile == NULL) 
    { 
     printf("Unable to create file."); 
    } 

    /* The user didn't provide a packet source: Retrieve the local device list */ 
    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) 
    { 
     fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf); 
     return -1; 
    } 

    i = 0; 
    /* Print the list */ 
    for(d=alldevs; d; d=d->next) 
    { 
     printf("%d. %s\n ", ++i, d->name); 

     if (d->description) 
     { 
      printf(" (%s)\n", d->description); 
     } 
     else 
     { 
      printf(" (No description available)\n"); 
     } 
    } 

    if (i==0) 
    { 
     fprintf(stderr,"No interfaces found! Exiting.\n"); 
     return -1; 
    } 

    printf("Enter the interface number you would like to sniff : "); 
    scanf_s("%d" , &inum); 


    /* Jump to the selected adapter */ 
    for (d=alldevs, i=0; i< inum-1 ;d=d->next, i++); 

    /* Open the device */ 
    if ((fp= pcap_open(d->name, 
         100 /*snaplen*/, 
         PCAP_OPENFLAG_PROMISCUOUS /*flags*/, 
         20 /*read timeout*/, 
         NULL /* remote authentication */, 
         errbuf) 
         ) == NULL) 
    { 
     fprintf(stderr,"\nError opening adapter\n"); 
     return -1; 
    } 

    //read packets in a loop :) 
    while((res = pcap_next_ex(fp, &header, &pkt_data)) >= 0) 
    { 
     if(res == 0) 
     { 
      // Timeout elapsed 
      continue; 
     } 
     seconds = header->ts.tv_sec; 
     localtime_s(&tbreak , &seconds); 
     strftime (buffer , 80 , "%d-%b-%Y %I:%M:%S %p" , &tbreak); 
     //print pkt timestamp and pkt len 
     //fprintf(logfile , "\nNext Packet : %ld:%ld (Packet Length : %ld bytes) " , header->ts.tv_sec, header->ts.tv_usec, header->len); 
     fprintf(logfile , "\nNext Packet : %s.%ld (Packet Length : %ld bytes) " , buffer , header->ts.tv_usec, header->len); 
     ProcessPacket(pkt_data , header->caplen); 
    } 

    if(res == -1) 
    { 
     fprintf(stderr, "Error reading the packets: %s\n" , pcap_geterr(fp)); 
     return -1; 
    } 

    return 0; 
} 
+0

可能重複[什麼是30ms的C中的經過時間後退出循環的最佳出路++ ](http://stackoverflow.com/questions/946167/what-is-the-best-way-to-exit-out-of-a-loop-after-an-elapsed-time-of-30ms-in- c) – 2013-03-10 20:32:29

回答

6
#include <signal.h> 
#include <stdlib.h> 

void exitfunc(int sig) 
{ 
    _exit(); 
} 

int main(int argc, char **argv) 
{ 
    signal(SIGALRM, exitfunc); 
    alarm(120); 

    return 0; 
} 

應該工作的

+0

我被建議添加評論。但我認爲如果你使用的是linux,你應該知道如何谷歌「c信號功能」和「c鬧鐘功能」。 – Dmitry 2013-03-06 07:25:31

+1

如果是POSIX'exit()'是**不是**保存將從信號處理程序調用。然而'_exit()'是(見'man 7 signal')。 – alk 2013-03-06 07:32:01

+0

任何參考? – Dmitry 2013-03-06 07:37:18