Hello! Sorry to bring this up yet again. I am aware of the history here, and the caveats in the documentation. However, I am seeing some weirdness on OS X when using pcap_get_selectable_fd() and select() that I can't find any explanation for (documentation, mailing list, etc.) and that I was wondering if someone can provide some insight on.
So, according to a comment from Guy in the CVS log for pcap-bpf.c, select() should work on BPF devices on Tiger. I built my program on Panther and it didn't work. Then I decided to give it a try on Tiger (based on what I read in the CVS log) and it didn't work either. However, I forgot and left the program running for a while. Then I noticed that the program seemed to be working. Originally select() was returning 0, indicating a timeout (and it was timing out after the right number of seconds). After the program had been running for some time, select() started to return 1, indicating that there was data ready to be read from one file descriptor. I read the data and everything worked great. What I wonder is why this is happening, why it takes a while for select() to start indicating that there is data ready to be read? Seems like OS X is buffering data and indicating that there is data after the buffer is full or something. Oh, another interesting data point is that I then ran my program on Panther (Tiger - 1) and saw the exact same behavior. For those that have OS X and want to see first-hand what I am talking about, I've included below a quick program that shows the behavior. To test, I just run the program below and at the same time run a ping from the same machine. The faster the pings are sent out (and responses received) the less time it takes for select() to indicate that there's data ready, which would support the buffering theory that I mentioned above. Any insight into what could be happening here, and any possible workarounds/solutions, will be very welcome. Thanks in advance. Cheers, Eloy Paris.- ---------------------------------------------------------------------- /* gcc -lpcap pcaptest.c */ #include <stdio.h> #include <unistd.h> #include <strings.h> #include <time.h> #include <pcap.h> int main(void) { pcap_t *pd; char errbuf[PCAP_ERRBUF_SIZE]; int fd, retval = 0; struct bpf_program fcode; struct timeval tv; fd_set rfds; time_t t; pd = pcap_open_live("en0", 65000, 1, 1, errbuf); fd = pcap_get_selectable_fd(pd); pcap_compile(pd, &fcode, "icmp", 1, 0); pcap_setfilter(pd, &fcode); while (retval == 0) { FD_ZERO(&rfds); FD_SET(fd, &rfds); tv.tv_sec = 1; /* select() will timeout after one second */ tv.tv_usec = 0; retval = select(fd + 1, &rfds, NULL, NULL, &tv); time(&t); printf("retval = %d %s", retval, ctime(&t) ); } return 0; } ---------------------------------------------------------------------- - This is the tcpdump-workers list. Visit https://lists.sandelman.ca/ to unsubscribe.