[C#] Wake on LAN マジックパケットを送信してリモートからPCを起動する

Pocket

ここでは、Wake on LAN に対応しているPCをリモートから起動するパケットを送信するサンプルプログラムを掲載しています。なお、PCがスリープ状態の場合はスリープ状態から復帰します。

スポンサーリンク

Wake on LAN の設定

今回、リモートで起動したPCは、DELL のデスクトップPCで Windows10 Home(64bit) が稼働していました。若干、選択項目の増加などありましたが、以下のリンク先を参照して BIOS やデバイスマネージャーから Wake on LAN の設定を行いました。

メモ

上記のリンク先で、次のように Wake on pattern match の設定があります。文字では「無効」にするとなっていますが、キャプチャ画像は「有効」のよう思え、非常にマギラワシイですが、「有効」と設定した場合でも Wake on LAN は正常に行えました。と、いいますか「有効」と設定した状態でしか確認していません(色々あって時間切れになりまして)。

Wake on pattern match

 

WOL マジックパケットの送信サンプル

前置きが長くなりましたが、実際に Wake on LAN の確認を行ってみます。Wake on LAN の設定を行ったPCに対して、同一サブネット上の別のPCからマジックパケットの送信を行います。スリープ状態の場合は復帰し、シャットダウンされている場合はPCが起動します。詳細はサンプル内のコメントを参照ください。

    // 宛先(ブロードキャスト)とポート番号
    // ポート番号は7や9を使うことが多いが任意のポート番号でOK
    string remoteHost = "255.255.255.255";
    int remotePort = 99;

    // 宛先は次のようにサブネットのブロードキャストでもOK
    // この場合はルータを超えることもできる
    //string remoteHost = "192.168.1.255";

    UdpClient udp = new UdpClient();

    // マジックパケットを作成する
    // 先頭6バイト:0xFF
    // 以降、リモートPCのマックアドレスを16回繰り返して設定する
    // 以下では、リモートPCのマックアドレスが 60-9A-4C-63-E5-51 の場合の例
    byte[] sendBytes = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51,
                        0x60,0x9A,0x4C,0x63,0xE5,0x51};

    // マジックパケットを送信する
    udp.Send(sendBytes, sendBytes.Length, remoteHost, remotePort);

    // ソケットクローズ
    udp.Close();

 

実験やってみた!

ちなみに、次のようにマジックパケットを、0xFFですべて埋め込んで送信してみました。もしかすると、WOLで起動可能な端末が全部起動しちゃうんじゃないかと期待を込めて!

その結果は?

            byte[] sendBytes = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};

全て起動せず!残念!

設定あったりするんですかね?それともRFCにちゃんと書いてあるのでしょうか。「ダメよ~ダメダメ」っていった具合に!

 

マジックパケットの仕様とWindows

マジックパケットの仕様(ペイロード)は上記サンプルの通りですが、UDPのペイロードとしてマジックパケットを送る以外にも、イーサヘッダのペイロードとして送る方法もあるらしいです。

昔々の記憶では、Linux であれば RAWソケットを使ってイーサヘッダ部分も加工してパケットの送受信することは比較的プログラミングしやすかったはずです(大変は大変ですが)。

しかし、Windows でイーサヘッダから加工してパケットを送信するとなると、「面倒なことこの上なし」だった記憶もあります。よって、UDP のペイロードとしても送れるようにしたのは Windows 対策だったんじゃないかとも思います。(違うと思いますが。。。)

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *