0

我想使用 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 与另一台主机建立 TCP 连接,如果另一台主机启动主动 TCP 关闭,我想检测这个主动关闭。理想情况下, 如果其他主机启动主动关闭,我应该使用 aselect和 a ,会注意到有一些东西,然后我看看是否'n = 0'。但是用pcap,select不能和pcap配合n=recv(rd_fd, ...)selectrd_fd

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

4

1 回答 1

1

select不能和pcap配合

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

你在 Linux 上工作,所以应该只是工作。

(如果你在使用 BPF 的系统上运行,例如 *BSD 或 OS X,你可能会遇到这个问题,至少在这些操作系统的旧版本中是这样;各种 *BSD 已经修复了它们的 select-with-BPF 错误一段时间;在 OS X 上,我在 Lion 中修复了它,因此在 Snow Leopard 和更早版本上可能会出现问题。)

于 2013-04-17T19:36:12.333 回答