我的程序捕获来自互联网的网络流量,以分析数据包的不确定性。我正在使用winPcap库。现在我希望程序运行2分钟&自动退出程序而无需手动关闭命令提示符控制台。你能为我提供这样做的代码吗? 谢谢
代码如下:
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 :(得分: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;
}
应该有效