Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 在环回设备上打开的packetsocket两次接收所有数据包。如何过滤这些重复条目?_Sockets_Tcpdump - Fatal编程技术网

Sockets 在环回设备上打开的packetsocket两次接收所有数据包。如何过滤这些重复条目?

Sockets 在环回设备上打开的packetsocket两次接收所有数据包。如何过滤这些重复条目?,sockets,tcpdump,Sockets,Tcpdump,当我在环回接口(lo)上打开一个packetsocket并监听时,所有数据包都会被看到两次。为什么会这样 但是,使用tcpdump在接口上进行捕获会正确地忽略重复的条目。请参阅“筛选器接收的数据包”(其中包含重复数据包)和“捕获的数据包”。这个过滤是如何完成的 tcpdump-i低-s 0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on lo, link-type EN

当我在环回接口(lo)上打开一个
packetsocket
并监听时,所有数据包都会被看到两次。为什么会这样

但是,使用tcpdump在接口上进行捕获会正确地忽略重复的条目。请参阅“筛选器接收的数据包”(其中包含重复数据包)和“捕获的数据包”。这个过滤是如何完成的

tcpdump-i低-s 0

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
11:00:08.439542 IP 12.0.0.3 > localhost.localdomain: icmp 64: echo request seq 1
11:00:08.439559 IP localhost.localdomain > 12.0.0.3: icmp 64: echo reply seq 1
11:00:09.439866 IP 12.0.0.3 > localhost.localdomain: icmp 64: echo request seq 2
11:00:09.439884 IP localhost.localdomain > 12.0.0.3: icmp 64: echo reply seq 2
11:00:10.439389 IP 12.0.0.3 > localhost.localdomain: icmp 64: echo request seq 3
11:00:10.439410 IP localhost.localdomain > 12.0.0.3: icmp 64: echo reply seq 3

6 packets captured
12 packets received by filter
0 packets dropped by kernel
我的代码:

int main()
{
  int sockFd;

  if ( (sockFd=socket(PF_PACKET, SOCK_DGRAM, 0))<0 ) {
    perror("socket()");
    return -1;
  }

  /* bind the packet socket */
  struct sockaddr_ll addr;
  struct ifreq ifr;
  strncpy (ifr.ifr_name, "lo", sizeof(ifr.ifr_name));
  if(ioctl(sockFd, SIOCGIFINDEX, &ifr) == -1)
  {
    perror("iotcl");
    return -1;
  }
  memset(&addr, 0, sizeof(addr));
  addr.sll_family=AF_PACKET;
  addr.sll_protocol=htons(ETH_P_ALL);
  addr.sll_ifindex=ifr.ifr_ifindex;
  if ( bind(sockFd, (struct sockaddr *)&addr, sizeof(addr)) ) {
    perror("bind()");
    return -1;
  }

  char buffer[MAX_BUFFER+1];
  int tmpVal = 1;

  while(tmpVal > 0)
  {
    tmpVal = recv (sockFd, buffer, MAX_BUFFER, 0);
    cout<<"Received Pkt with Bytes "<<tmpVal <<endl;
  }
}
intmain()
{
int-sockFd;
if((sockFd=socket(PF_数据包,SOCK_DGRAM,0))0)
{
tmpVal=recv(sockFd,缓冲区,最大缓冲区,0);

我没办法解决这个问题

从libcaps代码:

 *   - The loopback device gives every packet twice; on 2.2[.x] kernels,
 *     if we use PF_PACKET, we can filter out the transmitted version
 *     of the packet by using data in the "sockaddr_ll" returned by
 *     "recvfrom()", but, on 2.0[.x] kernels, we have to use
 *     PF_INET/SOCK_PACKET, which means "recvfrom()" supplies a
 *     "sockaddr_pkt" which doesn't give us enough information to let
 *     us do that.
侦听实体需要使用从recvfrom api获取的if_索引过滤重复数据包