ようこそ。睡眠不足なプログラマのチラ裏です。

ARPテーブルの取得(F#) おまけもあるよ。


元ネタ:ARPテーブルの取得 (C#)(F#) - SIN@SAPPOROWORKSの覚書
http://d.hatena.ne.jp/spw0022/20111108/1320700838


SINさんがF#を書きまくっている今日この頃。F#の街札幌のF#りょくの高まりを感じざるを得ない。
F#らしい書き方かどうかはわかりませんが、SINさんのコードをベースにあまり深く考えずに。
コメント欄にお邪魔するには長いのでこちらで。


ARP(Address Resolution Protocol)テーブルの取得

#nowarn "9" "51"

open System
open System.Runtime.InteropServices
open System.Linq

[<DllImport("iphlpapi.dll")>]
extern int GetIpNetTable(IntPtr pTcpTable, int *pdwSize, bool bOrder);

[<Struct; StructLayout(LayoutKind.Sequential)>]
type MIB_IPNETROW =
    val Index:int
    val PhysAddrLen:int
    [<MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)>]
    val PhysAddr:byte []
    val Addr:int
    val Type:int

let ipstr(addr:int)=
    let b = BitConverter.GetBytes(addr)
    sprintf "%d.%d.%d.%d" b.[0] b.[1] b.[2] b.[3] 

let macstr(m:byte []) = 
    sprintf "%02x-%02x-%02x-%02x-%02x-%02x"  m.[0] m.[1] m.[2] m.[3] m.[4] m.[5]

let typeStr = ["";"その他";"無効";"動的";"静的"]

//取得部分
let ar = 
  let mutable size = 0
  GetIpNetTable(IntPtr.Zero, &&size, true) |> ignore
  let p = Marshal.AllocHGlobal(size)
  if GetIpNetTable(p, &&size, true) = 0 then 
    let end' = Marshal.ReadInt32(p) - 1
    let result = 
      let step = Marshal.SizeOf(typeof<MIB_IPNETROW>)
      let getPtr = 
        let ptr' = ref (IntPtr.Add(p, 4)) 
        (fun num -> if num=0 then !ptr'  else ptr':=IntPtr.Add(!ptr',step); !ptr') 
      [0..end'] |> List.map (fun x -> getPtr x) 
                |> List.map (fun ptr -> Marshal.PtrToStructure(ptr, typeof<MIB_IPNETROW>) :?> MIB_IPNETROW) 
    Marshal.FreeHGlobal(p) 
    result
  else []

//出力部分
printfn "インデックス\tインターネット アドレス\t物理アドレス\t種類"
ar |> List.toSeq 
   |> Seq.groupBy (fun n -> n.Index)
   |> Seq.iter (fun (i,ms) ->
                  printfn "\nインターフェース:0x%x\n  インターネット アドレス\t物理アドレス\t種類" i
                  ms |> Seq.iter (fun m -> printfn "  %-15s\t%s\t%s" <| ipstr(m.Addr) <| macstr(m.PhysAddr) <| typeStr.[m.Type]))
    
printfn "何かのキーを押してください。"
Console.ReadKey() |> ignore



■主な変更点とかモロモロ

  • ワーニングの波線が残り続けるのは、精神衛生上アレなので #nowarn で非表示に。
  • 取得部分をひとまとめの関数に。
  • なるべく、みゅーたぶり(mutableを使い)たくはないので、そのあたりをいじる。
  • 「for 〜 in 〜 do 〜」を利用することは、決してわるいことではありません。が、F#ではSeqモジュールを利用してLINQのノリで書ける。
  • 元ネタ「ar.Where(fun (x:MIB_IPNETROW) -> x.Index=i.Key)」で再度絞り込みする必要はなく、arのGroupByした結果をそのまま利用して結果を出力する。
  • 前方パイプライン演算子には負けますが、後方パイプライン演算子もなかなかかわいいです。
  • ふつうのF#erなので、奇をてらったへんたいコードは書きません。


おまけ

趣旨からはだいぶズレますが、コマンドラインからコマンドを実行して取得した値をそのまま書き出すズルしてみたり:p

open System

let filename = Environment.GetEnvironmentVariable("ComSpec")
let arguments = @"/c arp -a"
let psi = new Diagnostics.ProcessStartInfo(filename, arguments, CreateNoWindow = true, UseShellExecute = false, RedirectStandardInput = false, RedirectStandardOutput = true) 
let p = Diagnostics.Process.Start(psi)
p.WaitForExit()
let results = p.StandardOutput.ReadToEnd()
printfn "%s" results
Console.ReadKey () |> ignore


これはひどいw

観たやつ


#552. チャットルーム
チャットルーム [DVD]
中田秀夫監督作品。実際にはネット越しでチャットしている様子を、
直接会話しているようなビジュアルで表現されている。最初分かりにくかった(ぇ
あまり見どころもない割に最後の後味もよくない。ん〜。


#553. アヒルと鴨のコインロッカー
アヒルと鴨のコインロッカー [DVD]
途中でトリックに気づいてしまいましたが、まあ最後まで観れた。
観ないとタイトルがイミフすぎますw 瑛太って割となんでもできる役者っぽい感じなんだけど、
印象強い役とかないかもなー。濱田岳って独特だよなあとかとか。


#554. インシテミル
インシテミル 7日間のデス・ゲーム [DVD]
この手の設定の作品はもう珍しくないですからねぇ...。


#555. ザ・シューター/極大射撃
ザ・シューター/極大射程 スペシャル・コレクターズ・エディション [DVD]
B級ではありますが、細かいことはキニシナイ。スナイパーかっけー


#556. 悪人
悪人 スタンダード・エディション [DVD]
吉田修一の話題作を、妻夫木聡深津絵里主演で映画化。いずれも体当たり演技で好演。
別段むずかしい話はない。単純でもありそうでなかったお話(?)
あ。かつてはFolder5満島ひかりもすっかりいい女優となったなあ。



#557. ストレンジャーコール
ストレンジャー・コール [DVD]
ストーキングの怖さ不気味さこそ感じられるものの、
ストーリーは単調で少し退屈。というかラストが普通すぎる...。
でも、主演のカミーラ・ベルは美人さんでよいですね。


#558. 腑抜けども悲しみの愛を見せろ
腑抜けども、悲しみの愛を見せろ [DVD]
なにこのひどい映画wwwクソワロタwww、という表現が合いそう。
「お姉ちゃんは最高に面白いよ」まさにこれに尽きる。
そして、家族の恥でも描かずにはいられない妹のクリエーターとしての業の深さ。
でも、扇風機が回っちゃうのはなんだったの?永作博美若けぇなあ。


#559. 孤高のメス
孤高のメス [DVD]
医者ものはドラマにしろ映画にしろ結構好きだったりする。こんなカッコイイ医者いるんですかねえ。
堤真一の孤高の医者ぶりもよかったですが、それを引き立てていた夏川結衣がいい仕事しました。


#560. コドモのコドモ
コドモのコドモ [DVD]
コドモがSEXしてコドモ作る映画。"これはひどい"タグが似合う作品。


#561. アンフェア the movie
アンフェア the movie [DVD]
雪村って苗字いいよな(何


#562. ダークネス
ダークネス [DVD]
スペイン映画。ちょっと怖いサスペンスホラー。
ラストで明かされる首謀者がふつう(笑


#563. インビジブル2
インビジブル2 [DVD]
お色気シーンはサービースサービスってゆーけど...
一作目がB級ながらも楽しめたのに対して、これはつまんない。どうしてこうなった。


#564. リトル・ミス・サンシャイン
リトル・ミス・サンシャイン [DVD]
「ヤッてヤッてヤリまくれ」が印象的すぎる(ぇ
すばらしきロードムービー。映画好きなら見ておきたい一本ですな。


#565. キューティーブロンドハッピーMAX
キューティ・ブロンド2/ハッピーMAX (特別編) [DVD]
結構クセはあるけど、これはパワーもらえますよ!


#566. ドット・ジ・アイ
ドット・ジ・アイ [DVD]
いろいろ濃い。んだけど、自分には響かなかったなー


#567. クロサギ
映画 クロサギ (スタンダード・エディション) [DVD]
ドラマぜんぜん見てないのに観たんだけど、まぁ観れた。
とりあえず、いろんな意味で山Pファンのための作品ですね。


#568. アフタースクール
アフタースクール [DVD]
運命じゃない人」でカンヌ4冠を獲得した内田けんじ監督の作品。
これも「やられた」って感じ。おもしろいなー


#569. 図鑑に載ってない虫
図鑑に載ってない虫 完全攻略版(2枚組) [DVD]
仮死体験ができるという“死にモドキ”を探すお話。期待せずに観たが、意外や意外…。
まじめな部分は何一つなく、非常にクダラナーイ話のみで構成されているが、笑って見れる昭和テイストのロードムービー
キャストも、伊勢谷友介、松尾スズキ菊地凛子と一癖もふた癖ある人たちで観ててあきません。
いやしかし、冒頭の水野美紀…、女優とは大変なお仕事なのですねwww


#570. 叫
叫 プレミアム・エディション [DVD]
役所広司小西真奈美はともかく、葉月里緒奈が...(笑
葉月里緒奈がでてくるたびに吹きそうになって、ぜんぜん恐怖を感じなかった。
ああいう役は、もっと名の売れていない女優さんが演じた方がいいと思うんだ。


#571. ペルソナ
ペルソナ [DVD]
正直みないほうがいい(笑