阻塞pcap和多个I / O`select`

我想使用pcap捕获数据包,然后将捕获的数据包发送到另一个主机我的源代码片段如下所示:

for(;;){ pcap_packet = pcap_next(pcap_handler, &pcap_header); if(pcap_packet !=NULL) printf("capture a packet with length of %d\n", pcap_header.len); // send the packet as payload to the sender, excluding the Ethernet Header n = send(sd_proxy, pcap_packet+ETHERNET_HDR_LEN, pcap_header.len-ETHERNET_HDR_LEN, 0); if(n<0){ shutdown(connfd, SHUT_RDWR); close(connfd); break; } new } 

所以基本上我希望程序被pcap_next阻塞,一旦套接字sd_proxy与另一个主机build立了一个TCP连接,如果另一个主机启动了一个活动的TCPclosures,我想检测到这个activeclosures。 理想情况下,我应该使用一个select和一个n=recv(rd_fd, ...)如果另一个主机启动一个主动closures, select会注意到有一些与rd_fd然后我看是否'n = 0'。 但是用pcapselect不能与pcap配合使用

那么如何完成我的任务? 谢谢!

选择不能配合pcap

为什么不? 您是否尝试过在pcap_handler上使用pcap_get_selectable_fd()pcap_handler生成的文件描述符添加到在select()调用中设置的文件描述符中?

你正在使用Linux,所以应该只是工作。

(如果你运行的是使用BPF的系统,比如* BSD或者OS X,那么你可能会遇到这样的问题,至少在这些操作系统的老版本中是这样的;各种* BSD的select-with-BPF错误已经修复有一段时间;在OS X上,我将它固定在Lion上,所以在Snow Leopard和更早的版本上可能会有问题。)