libpcap 사용 시 문제점.
글쓴이: twins99 / 작성시간: 일, 2009/03/08 - 5:55오후
..
..
..
libpcap을 사용 중입니다.
궁금한 것이 pcap_dispatch()의 return값이 들쑥 날쑥하게 0으로 나왔다 1로 나왔다 합니다.
어떨때는 쭉~ 0으로 나오면서 system이 거의 hangup되는 수준까지 가네요.(control+C가 먹질 않을정도..)
무엇이 문제일까요?
제가 TEST중인 코드는 다음과 같습니다.
static void ping_recv(pcap_t *pcap,u_int32_t packetwait, pcap_handler func)
{
struct timeval tv,tv2;
char done = 0;
#ifndef WIN32
fd_set fds;
#endif
if(verbose>3) {
printf("arping: receiving packets...\n");
}
tv.tv_sec = packetwait / 1000000;
tv.tv_usec = packetwait % 1000000;
int count = 0;
for (;!done;) {
int sr;
FD_ZERO(&fds);
FD_SET(pcap_fileno(pcap), &fds);
if (-1 == gettimeofday(&tv2,NULL)) {
fprintf(stderr, "arping: "
"gettimeofday(): %s\n",
strerror(errno));
sigint(0);
}
// printf("running select()\n");
switch(sr = select(pcap_fileno(pcap)+1,
&fds,
NULL,NULL,&tv)) {
case -1:
if (errno == EINTR) {
return;
}
fprintf(stderr, "arping: select(): "
"%s\n", strerror(errno));
sigint(0);
case 0:
printf("select DONE:%d\n",__LINE__);
done = 1;
break;
default: {
int ret;
if (1 != (ret = pcap_dispatch(pcap, -1,
func,
NULL))) {
// rest, so we don't take 100% CPU... mostly
// hmm... does usleep() exist everywhere?
printf("usleep pcap_dispatch:%d\n", ret);
usleep(10);
#ifndef HAVE_WEIRD_BSD
// weird is normal on bsd :)
/* if (verbose) {
fprintf(stderr, "arping: select=%d "
"pcap_dispatch=%d!\n",
sr, ret);
}*/
#endif
}
if(count > 100){
done = 1;
count =0;
}
else
count++;
break; }
}
if (-1 == gettimeofday(&tv,NULL)) {
fprintf(stderr, "arping: "
"gettimeofday(): %s\n",
strerror(errno));
sigint(0);
}
/*
* setup next timeval, not very exact
*/
tv.tv_sec = (packetwait / 1000000)
- (tv.tv_sec - tv2.tv_sec);
tv.tv_usec = (packetwait % 1000000)
- (tv.tv_usec - tv2.tv_usec);
while (tv.tv_usec < 0) {
tv.tv_sec--;
tv.tv_usec += 1000000;
}
if (tv.tv_sec < 0) {
tv.tv_sec = tv.tv_usec = 0;
}
printf("FUNC:%s, LINE:%d\n", __FUNCTION__, __LINE__);
usleep(10000);
}
// if (tv.tv_usec == 0) {
// tv.tv_usec = 1;
// }
if (-1 == select(0, NULL,NULL,NULL, &tv)) {
if (errno == EINTR) {
return;
}
fprintf(stderr, "arping: select(delay): %s\n",strerror(errno));
sigint(0);
}
}Forums:


댓글 달기