C 言語で IP アドレス判定する

Pocket

Hadoop Pig でアクセスログを解析していると、IP アドレス範囲を解析したい場合ってありますよね

Pig で IP アドレス範囲をチェックする場合、UDF を作る必要があります

ただ、私は Java を使うことが UDF 作る時しなないので・・・、
一旦 C で作り、そのコードを Java に落とすことにしました

その時作った C のサンプルコード

#include  <stdio.h>
#include  <string.h>
#include  <stdlib.h>

unsigned long ip2ulong(unsigned int *ip)
{
  unsigned long ips = 0;
  int i = 0;

  for (i=0;i<3;i++)
  {
    ips += *ip;
    ips = ips << 8;
    ip++;
  }
  ips += *ip;

  return ips;
}

int main(int argc, char *argv[])
{
  unsigned int range_ip[4], check_ip[4];
  unsigned int mask;
  unsigned long range_ips,check_ips;

  range_ips = check_ips = 0;

  /*
  ** IP アドレス範囲
  */
  range_ip[0] = 182;
  range_ip[1] = 250;
  range_ip[2] = 0;
  range_ip[3] = 0;
  // ネットマスク
  mask = 15;

  //
  // チェックしたい IP
  //
  check_ip[0] = 182;
  check_ip[1] = 250;
  check_ip[2] = 244;
  check_ip[3] = 16;

  range_ips = ip2ulong(range_ip);
  check_ips = ip2ulong(check_ip);

  range_ips = (range_ips >> (32-mask)) << (32-mask);
  check_ips = (check_ips >> (32-mask)) << (32-mask);

  if ( check_ips == range_ips )
  {
    printf("match\n");
    return 1;
  }
  else
  {
    printf("unmatch\n");
    return 0;
  }
}

コメントを残す