我想使用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和更早的版本上可能会有问题。)