2013-03-06 54 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

相关问题