tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル.NET FrameWork1.1でPing送信コード
記事No8862
投稿日: 2009/04/14(Tue) 22:42
投稿者まる
はじめまして。
まると申します。
質問があり投稿させて頂きました。

現在、Visual Studio2005を利用しPDAからMagic Packetを送信して家内パソコンを選択遠隔起動出来るソフトを作成しております。
Magic Packetを指定のMACアドレスへ送信するソフトは出来たのですが、遠隔起動出来るパソコンと出来ないパソコンがありました。
しかし、Magic Packet送信で遠隔起動出来ないパソコンはPing送信で起動出来ました。
そこで、Magic Packetで起動出来ないパソコンだけPingで起動させるソフトを作成したいと考えております。

PDA(WindowsMobile2003)アプリケーション作成は、.NET FrameWork1.1を利用するのですが、.NET FrameWork1.1は、Pingクラス(System.Net.NetworkInformation名前空間)やMy.Computer.Network.Pingメソッドを利用出来ません・・・。
ネットで、Socketクラスを利用するような情報を見つけましたが具体的な方法の記載がありませんでした。

何方様か、.NET FrameWork1.1でPing送信方法をご存知でしたらお教え頂ければ幸いです。
宜しくお願い致します。

[ツリー表示へ]
タイトルRe: .NET FrameWork1.1でPing送信コード
記事No8863
投稿日: 2009/04/14(Tue) 23:08
投稿者オショウ
> 何方様か、.NET FrameWork1.1でPing送信方法をご存知でしたらお教え頂ければ幸いです。
> 宜しくお願い致します。

  何年か前に作ったコード・・・
  抜粋なんで、このままだとエラーするかと。
  適宜修正して下さい。

using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;

  #region Memory Management
    [DllImport("coredll")]
    extern public static IntPtr LocalAlloc(int flags, int size);
    [DllImport("coredll")]
    extern public static IntPtr LocalFree(IntPtr pMem);

    const int LMEM_ZEROINIT = 0x40;
  #endregion

  #region IPHLPAPI P/Invokes
  [DllImport("iphlpapi")]
  extern public static IntPtr IcmpCreateFile ();
  [DllImport("iphlpapi")]
  extern public static bool IcmpCloseHandle(IntPtr h);
  [DllImport("iphlpapi")]
  extern public static uint IcmpSendEcho(
    IntPtr IcmpHandle,
    uint DestinationAddress,
    byte[] RequestData,
    short RequestSize,
    IntPtr /*IP_OPTION_INFORMATION*/ RequestOptions,
    byte[] ReplyBuffer,
    int ReplySize,
    int Timeout );
  #endregion

  [DllImport("coredll")]
  extern static int GetLastError();

  public class ICMP_ECHO_REPLY {
    public ICMP_ECHO_REPLY(int size) { data = new byte[size]; }
    byte[] data;
    public byte[] _Data { get { return data; } }
    public int Address { get { return BitConverter.ToInt32(data, 0); } }
    public int Status { get { return BitConverter.ToInt32(data, 4); } }
    public int RoundTripTime  { get { return BitConverter.ToInt32(data, 8); } }
    public short DataSize  { get { return BitConverter.ToInt16(data, 0xc); }  set
{ BitConverter.GetBytes( value ).CopyTo(data, 0xc);} }
    public IntPtr Data { get { return new IntPtr(BitConverter.ToInt32(data, 0x10)); }  set { BitConverter.GetBytes( value.ToInt32() ).CopyTo(data, 0x10);} }
    public byte Ttl {get { return data[0x14]; } }
    public byte Tos {get { return data[0x15]; } }
    public byte Flags {get { return data[0x16]; } }
    public byte OptionsSize {get { return data[0x17]; } }
    public IntPtr OptionsData { get { return new IntPtr(BitConverter.ToInt32(data, 0x18)); }  set { BitConverter.GetBytes( value.ToInt32() ).CopyTo(data, 0x18);} }
}

  private void btnPing_Click(object sender, System.EventArgs e){

    string addr = txtHost.Text;

    IPHostEntry entry = null;
    try {
      entry = Dns.GetHostByName(addr);
    } catch( SocketException ){
    }

    if (entry==null || entry.AddressList.Length == 0){
      MessageBox.Show("Could not resolve " + addr);
      txtHost.Focus();
      return;
    }

    lblHost.Text = entry.AddressList[0].ToString();

    byte[] RequestData = Encoding.ASCII.GetBytes( new string('\0', 64) );

    //Allocate ICMP_ECHO_REPLY structure
    ICMP_ECHO_REPLY reply = new ICMP_ECHO_REPLY(255);
    reply.DataSize = 255;
    IntPtr pData = LocalAlloc(LMEM_ZEROINIT, reply.DataSize);
    reply.Data = pData;
    IntPtr h = IcmpCreateFile();
    uint ipaddr = (uint)entry.AddressList[0].Address;

    listBox1.Items.Clear();

    for ( int i = 0; i < (int)udCount.Value; i++ ){
      uint ret = IcmpSendEcho(h, ipaddr, RequestData, (short)RequestData.Length, IntPtr.Zero, reply._Data, reply._Data.Length, 1000);
      int dwErr = 0;
      if ( ret == 0 ){
        dwErr = GetLastError();
        if ( dwErr != 11010 ) // If error is other than timeout - display a message
            MessageBox.Show("Failed to ping. Error code: " + dwErr.ToString());
      }

      if ( dwErr != 11010 )
        listBox1.Items.Add(string.Format("RTT: {0}, Data Size: {1}; TTL: {2}", reply.RoundTripTime, reply.DataSize, reply.Ttl));
      else
        listBox1.Items.Add("Request timed out");

      listBox1.SelectedIndex = listBox1.Items.Count - 1;

      Application.DoEvents();
      System.Threading.Thread.Sleep(100);
    }

    IcmpCloseHandle(h);

    LocalFree(reply.Data);
  }

● 動作確認環境が無いので、上記コードがOKか否か・・・
  解りません。あしからず・・・

以上。

[ツリー表示へ]
タイトルお礼
記事No8864
投稿日: 2009/04/15(Wed) 06:15
投稿者まる
オショウ 様

コードまで教えていただきありがとうございます。
記載内容を元にチャレンジしたいと思います。
ありがとうございました。

失礼します。

[ツリー表示へ]
タイトルRe: .NET FrameWork1.1でPing送信コード
記事No8869
投稿日: 2009/04/17(Fri) 16:04
投稿者魔界の仮面弁士
# 本題とは関係の無いところに反応。

> PDA(WindowsMobile2003)アプリケーション作成は、.NET FrameWork1.1を利用するのですが、

FrameWork → Framework という突っ込みはさておき。

.NET Framework 1.1 は、Windows Mobile 2003 をサポートしていませんので、
.NET Compact Framework 1.0/2.0/3.5 を使う必要があるかと。

[ツリー表示へ]