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

Pocket

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

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

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

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

<br />
#include  &lt;stdio.h&gt;<br />
#include  &lt;string.h&gt;<br />
#include  &lt;stdlib.h&gt;</p>
<p>unsigned long ip2ulong(unsigned int *ip)<br />
{<br />
  unsigned long ips = 0;<br />
  int i = 0;</p>
<p>  for (i=0;i&lt;3;i++)<br />
  {<br />
    ips += *ip;<br />
    ips = ips &lt;&lt; 8;<br />
    ip++;<br />
  }<br />
  ips += *ip;</p>
<p>  return ips;<br />
}</p>
<p>int main(int argc, char *argv[])<br />
{<br />
  unsigned int range_ip[4], check_ip[4];<br />
  unsigned int mask;<br />
  unsigned long range_ips,check_ips;</p>
<p>  range_ips = check_ips = 0;</p>
<p>  /*<br />
  ** IP アドレス範囲<br />
  */<br />
  range_ip[0] = 182;<br />
  range_ip[1] = 250;<br />
  range_ip[2] = 0;<br />
  range_ip[3] = 0;<br />
  // ネットマスク<br />
  mask = 15;</p>
<p>  //<br />
  // チェックしたい IP<br />
  //<br />
  check_ip[0] = 182;<br />
  check_ip[1] = 250;<br />
  check_ip[2] = 244;<br />
  check_ip[3] = 16;</p>
<p>  range_ips = ip2ulong(range_ip);<br />
  check_ips = ip2ulong(check_ip);</p>
<p>  range_ips = (range_ips &gt;&gt; (32-mask)) &lt;&lt; (32-mask);<br />
  check_ips = (check_ips &gt;&gt; (32-mask)) &lt;&lt; (32-mask);</p>
<p>  if ( check_ips == range_ips )<br />
  {<br />
    printf(&quot;match\n&quot;);<br />
    return 1;<br />
  }<br />
  else<br />
  {<br />
    printf(&quot;unmatch\n&quot;);<br />
    return 0;<br />
  }<br />
}<br />

コメントを残す