[DllImport("iphlpapi.dll", ExactSpelling=true)] public static extern int SendARP( int DestIP, int SrcIP, [Out] byte[] pMacAddr, [Out] int PhyAddrLen );调用:byte[] aa=byte[6]; IPAddress addrD = IPAddress.Parse("192.168.1.20"); //需要取得MAC的网卡IP int len = aa.Length; int r = SendARP( (int) addrD.Address, 0 , aa, len ); string mac = BitConverter.ToString( aa, 0, 6 ); MessageBox.Show(mac);
to CSTerry(Terry) : 我得到的是00-00-00-00-00-00using System; using System.Net; using System.Runtime.InteropServices;class Program { [DllImport("iphlpapi.dll", ExactSpelling=true)] public static extern int SendARP( int DestIP, int SrcIP, [Out] byte[] pMacAddr, [Out] int PhyAddrLen ); static void Main() { byte[] aa=new byte[6]; IPAddress addrD = IPAddress.Parse("192.168.103.39"); //需要取得MAC的网卡IP int len = aa.Length; int r = SendARP( (int) addrD.Address, 0 , aa, len ); string mac = BitConverter.ToString( aa, 0, 6 ); Console.WriteLine(mac); } }
using System.Runtime.InteropServices;namespace UtilityControl
{
/// <summary>
/// 关于IP地址的若干操作
/// </summary>
public class IP
{
public IP()
{
//
// TODO: 在此处添加构造函数逻辑
//
} [DllImport("Iphlpapi.dll")]
private static extern int SendARP(Int32 dest,Int32 host,ref Int64 mac,ref Int32 length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip); /// <summary>
/// 根据ip得到网卡mac地址
/// </summary>
/// <param name="ip">给出的ip地址</param>
/// <returns>对应ip的网卡mac地址</returns>
public static Int64 GetMACByIP(string ip)
{
Int32 ldest= inet_addr(ip); //目的地的ip
try
{
Int64 macinfo = new Int64();
Int32 len = 6;
int res = SendARP(ldest,0, ref macinfo, ref len);
return macinfo;
}
catch(Exception err)
{
Console.WriteLine("Error:{0}",err.Message);
}
return 0;
}
}
}
怎么转化,是个问题。
public static extern int SendARP( int DestIP, int SrcIP, [Out] byte[] pMacAddr, [Out] int PhyAddrLen );调用:byte[] aa=byte[6];
IPAddress addrD = IPAddress.Parse("192.168.1.20"); //需要取得MAC的网卡IP
int len = aa.Length;
int r = SendARP( (int) addrD.Address, 0 , aa, len );
string mac = BitConverter.ToString( aa, 0, 6 );
MessageBox.Show(mac);
[DllImport("Iphlpapi.dll")]
private static unsafe extern int SendARP(Int32 dest,Int32 host,ref IntPtr mac,ref IntPtr length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip);Int32 ldest= inet_addr("157.60.68.163");//目的地的ip
Int32 lhost= inet_addr("157.60.68.33");//本地的iptry
{
Byte[] macinfo=new Byte[6];
Int32 length=6;
IntPtr mac=new IntPtr(macinfo[0]);
IntPtr len=new IntPtr(6);
int ii=SendARP(ldest,lhost, ref mac, ref len);
Console.WriteLine("Mac Add:"+mac);
Console.WriteLine("length:"+len);
}
catch(Exception err)
{
Console.WriteLine(err);
}
文章标题:用C#取网卡MAC地址的类源码
未知 aspxcn.com 2002-09-19
在下公布这段代码,目的是与大家探讨有无更好的实现方法(如.NET存在直接调用?)。
在下愿与大家共同挖掘C#的精妙之处,一起揭示C#的神秘面纱。 如有不妥,可尽情表达。
1、
[code]
public enum NCBCONST
{
NCBNAMSZ =16, /* absolute length of a net name */
MAX_LANA =254, /* lana's in range 0 to MAX_LANA inclusive */
NCBENUM =0x37, /* NCB ENUMERATE LANA NUMBERS */
NRC_GOODRET =0x00, /* good return */
NCBRESET =0x32, /* NCB RESET */
NCBASTAT =0x33, /* NCB ADAPTER STATUS */
NUM_NAMEBUF =30, /* Number of NAME's BUFFER */
} [StructLayout(LayoutKind.Sequential)]
public struct ADAPTER_STATUS
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=6)]
public byte[] adapter_address;
public byte rev_major;
public byte reserved0;
public byte adapter_type;
public byte rev_minor;
public ushort duration;
public ushort frmr_recv;
public ushort frmr_xmit;
public ushort iframe_recv_err;
public ushort xmit_aborts;
public uint xmit_success;
public uint recv_success;
public ushort iframe_xmit_err;
public ushort recv_buff_unavail;
public ushort t1_timeouts;
public ushort ti_timeouts;
public uint reserved1;
public ushort free_ncbs;
public ushort max_cfg_ncbs;
public ushort max_ncbs;
public ushort xmit_buf_unavail;
public ushort max_dgram_size;
public ushort pending_sess;
public ushort max_cfg_sess;
public ushort max_sess;
public ushort max_sess_pkt_size;
public ushort name_count;
} [StructLayout(LayoutKind.Sequential)]
public struct NAME_BUFFER
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)]
public byte[] name;
public byte name_num;
public byte name_flags;
} [StructLayout(LayoutKind.Sequential)]
public struct NCB
{
public byte ncb_command;
public byte ncb_retcode;
public byte ncb_lsn;
public byte ncb_num;
public IntPtr ncb_buffer;
public ushort ncb_length;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)]
public byte[] ncb_callname;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)]
public byte[] ncb_name;
public byte ncb_rto;
public byte ncb_sto;
public IntPtr ncb_post;
public byte ncb_lana_num;
public byte ncb_cmd_cplt;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=10)]
public byte[] ncb_reserve;
public IntPtr ncb_event;
} [StructLayout(LayoutKind.Sequential)]
public struct LANA_ENUM
{
public byte length;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.MAX_LANA)]
public byte[] lana;
} [StructLayout(LayoutKind.Auto)]
public struct ASTAT
{
public ADAPTER_STATUS adapt;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NUM_NAMEBUF)]
public NAME_BUFFER[] NameBuff;
}
public class Win32API
{
[DllImport("NETAPI32.DLL")]
public static extern char Netbios(ref NCB ncb);
}
[/code] 2、
[code]
public string GetMacAddress()
{
string addr="";
int cb;
ASTAT adapter;
NCB Ncb=new NCB();
char uRetCode;
LANA_ENUM lenum; Ncb.ncb_command = (byte)NCBCONST.NCBENUM;
cb = Marshal.SizeOf(typeof(LANA_ENUM));
Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);
Ncb.ncb_length = (ushort)cb;
uRetCode = Win32API.Netbios(ref Ncb);
lenum = (LANA_ENUM)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(LANA_ENUM));
Marshal.FreeHGlobal(Ncb.ncb_buffer);
if(uRetCode != (short)NCBCONST.NRC_GOODRET)
return ""; for(int i=0; i < lenum.length ;i++)
{
Ncb.ncb_command = (byte)NCBCONST.NCBRESET;
Ncb.ncb_lana_num = lenum.lana[i];
uRetCode = Win32API.Netbios(ref Ncb);
if(uRetCode != (short)NCBCONST.NRC_GOODRET)
return ""; Ncb.ncb_command = (byte)NCBCONST.NCBASTAT;
Ncb.ncb_lana_num = lenum.lana[i];
Ncb.ncb_callname[0]=(byte)'*';
cb = Marshal.SizeOf(typeof(ADAPTER_STATUS)) + Marshal.SizeOf(typeof(NAME_BUFFER))*(int)NCBCONST.NUM_NAMEBUF;
Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);
Ncb.ncb_length = (ushort)cb;
uRetCode = Win32API.Netbios(ref Ncb);
adapter.adapt = (ADAPTER_STATUS)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(ADAPTER_STATUS));
Marshal.FreeHGlobal(Ncb.ncb_buffer); if (uRetCode == (short)NCBCONST.NRC_GOODRET)
{
if(i>0)
addr += ":";
addr = string.Format("{0,2:X}{1,2:X}{2,2:X}{3,2:X}{4,2:X}{5,2:X}",
adapter.adapt.adapter_address[0],
adapter.adapt.adapter_address[1],
adapter.adapt.adapter_address[2],
adapter.adapt.adapter_address[3],
adapter.adapt.adapter_address[4],
adapter.adapt.adapter_address[5]);
}
}
return addr.Replace(' ', '0');
}
[/code]
在写程序时我们想对每一台计算机都生成一个唯一的标识,而且在一此共享软件中我们也看到,软件在不同的机器上生成了不同的标识,这是如何实现的呢,其实是软件有一部分程序读取了,本地计算机的一部分硬件参数(如硬盘序列号,网卡序列号等等),再通过一系列算法而得到了一个唯一标识,其实我们也可以通过一个api函数生成我们的唯一标识,由于硬盘人人都有,而网卡不一定每个人都有,所以以读硬盘序列号为例,
下面就先介绍一下我们要用到的api函数
BOOL GetVolumeInformation(
LPCTSTR lpRootPathName, // 硬盘的路径
LPTSTR lpVolumeNameBuffer, // 硬盘的卷标
DWORD nVolumeNameSize, // 卷标的字符串长度
LPDWORD lpVolumeSerialNumber, // 硬盘的序列号
LPDWORD lpMaximumComponentLength, // 最大的文件长度
LPDWORD lpFileSystemFlags, // 文件系统的一此标志
LPTSTR lpFileSystemNameBuffer, // 存储所在盘符的分区类型的长指针变量
DWORD nFileSystemNameSize // 分区类型的长指针变量所指向的字符串长度
);
如果上述函数成功就返回一个非0值。光说不做,是不行了,我们还得实践一下:// 最大的文件长度
首选用MFC AppWizard建立一个基于Dialog base的对话框工程,名为GetHardID,点击finish。
加一个按钮,双击它,点击ok,并在对应的函数中加入如下代码:
LPCTSTR lpRootPathName="c:\\"; //取C盘
LPTSTR lpVolumeNameBuffer=new char[12];//磁盘卷标
DWORD nVolumeNameSize=12;// 卷标的字符串长度
DWORD VolumeSerialNumber;//硬盘序列号
DWORD MaximumComponentLength;// 最大的文件长度
LPTSTR lpFileSystemNameBuffer=new char[10];// 存储所在盘符的分区类型的长指针变量
DWORD nFileSystemNameSize=10;// 分区类型的长指针变量所指向的字符串长度
DWORD FileSystemFlags;// 文件系统的一此标志
::GetVolumeInformation(lpRootPathName,
lpVolumeNameBuffer, nVolumeNameSize,
&VolumeSerialNumber, &MaximumComponentLength,
&FileSystemFlags,
lpFileSystemNameBuffer, nFileSystemNameSize);CString str;
str.Format("Seria Num is %lx ",VolumeSerialNumber);
AfxMessageBox(str);编译,链接并运行程序,单击按钮,在弹出的对话框中就是我们要的序列号。
对不对我们验证一下,进入dos窗口,打入"dir c:/p"命令,怎么样是不是和我们的程序显示的一模一样
这样我们就在功告成了。
我得到的是00-00-00-00-00-00using System;
using System.Net;
using System.Runtime.InteropServices;class Program
{
[DllImport("iphlpapi.dll", ExactSpelling=true)]
public static extern int SendARP( int DestIP, int SrcIP, [Out] byte[] pMacAddr, [Out] int PhyAddrLen ); static void Main()
{
byte[] aa=new byte[6];
IPAddress addrD = IPAddress.Parse("192.168.103.39"); //需要取得MAC的网卡IP
int len = aa.Length;
int r = SendARP( (int) addrD.Address, 0 , aa, len );
string mac = BitConverter.ToString( aa, 0, 6 );
Console.WriteLine(mac);
}
}