i0703mtf
2017-12-16 17:06
采纳率: 100%
浏览 1.5k

c# 根据Mac地址收发数据包的方式?(插件)

我想根据mac地址收/发二进制数据,请问有什么好的实现方式吗,有哪些好用的库?
以前实现是用winpcap、c++实现的,收发数据有时不稳定,看看有没有基于其他方式实现的。

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • threenewbee 2017-12-17 04:16
    已采纳

    c#也一般用winpcap,因为要在mac层而不是ip层上做,至于收发不稳定,应该是你的代码的问题。

    打赏 评论
  • 1 通过IPConfig命令读取MAC地址

    ///
    /// 根据截取ipconfig /all命令的输出流获取网卡Mac
    ///
    ///
    publicstatic List GetMacByIPConfig()
    {
    List macs=new List();
    ProcessStartInfo startInfo = new ProcessStartInfo("ipconfig","/all");
    startInfo.UseShellExecute = false;
    startInfo.RedirectStandardInput = true;
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardError = true;
    startInfo.CreateNoWindow = true;
    Process p = Process.Start(startInfo);
    //截取输出流
    StreamReader reader = p.StandardOutput;
    string line= reader.ReadLine();

    while (!reader.EndOfStream)
    {
    if (!string.IsNullOrEmpty(line))
    {
    line = line.Trim();

      if (line.StartsWith("Physical Address"))
      {
        macs.Add(line);
      }
    }
    
    line = reader.ReadLine();
    

    }

    //等待程序执行完退出进程
    p.WaitForExit();
    p.Close();
    reader.Close();

    return macs;
    }

    通过WMI读取MAC地址
    1)该方法依赖WMI的系统服务,该服务一般不会被关闭;但如果系统服务缺失或者出现问题,该方法无法取得MAC地址。

    ///
    /// 通过WMI读取系统信息里的网卡MAC
    ///
    ///
    publicstatic List GetMacByWMI()
    {
    List macs=new List();
    try
    {
    string mac="";
    ManagementClass mc =new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObjectCollection moc = mc.GetInstances();
    foreach (ManagementObject moin moc)
    {
    if ((bool)mo["IPEnabled"])
    {
    mac = mo["MacAddress"].ToString();
    macs.Add(mac);
    }
    }
    moc =null;
    mc =null;
    }
    catch
    {
    }

    return macs;
    }
    3 通过NetworkInterface读取MAC地址
    1)如果当前的网卡是禁用状态(硬件处于硬关闭状态),取不到该网卡的MAC地址,(您可以通过禁用网卡进行试验)。
    2)如果当前启用了多个网卡,最先返回的地址是最近启用的网络连接的信息

    //返回描述本地计算机上的网络接口的对象(网络接口也称为网络适配器)。
    publicstatic NetworkInterface[] NetCardInfo()
    {
    return NetworkInterface.GetAllNetworkInterfaces();
    }

    ///
    /// 通过NetworkInterface读取网卡Mac
    ///
    ///
    publicstatic List GetMacByNetworkInterface()
    {
    List macs=new List();
    NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
    foreach (NetworkInterface niin interfaces)
    {
    macs.Add(ni.GetPhysicalAddress().ToString());
    }
    return macs;
    }
    4 通过SendARP读取MAC地址
    ///
    /// 通过SendARP获取网卡Mac
    /// 网络被禁用或未接入网络(如没插网线)时此方法失灵
    ///
    ///
    ///
    publicstaticstring GetMacBySendARP(string remoteIP)
    {
    StringBuilder macAddress =new StringBuilder();

    try
    {
    Int32 remote = inet_addr(remoteIP);

    Int64 macInfo =new Int64();
    Int32 length =6;
    SendARP(remote, 0,ref macInfo,ref length);
    
    string temp= Convert.ToString(macInfo,16).PadLeft(12,'0').ToUpper();
    
    int x =12;
    for (int i=0; i<6; i++)
    {
      if (i==5)
      {
        macAddress.Append(temp.Substring(x -2,2));
      }
      else
      {
        macAddress.Append(temp.Substring(x -2,2) +"-");
      }
      x -=2;
    }
    
    return macAddress.ToString();
    

    }
    catch
    {
    return macAddress.ToString();
    }
    }

    [DllImport("Iphlpapi.dll")]
    privatestaticexternint SendARP(Int32 dest, Int32 host,ref Int64 mac,ref Int32 length);
    [DllImport("Ws2_32.dll")]
    privatestaticextern Int32 inet_addr(string ip);
    5 从注册表读取MAC地址
    常规用户可通过读取注册表项Windows Genuine Advantage获取到物理网卡地址。

    1)如果注册表项被修改,则无法取得该MAC地址
    

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Genuine Advantage

    http://lib.csdn.net/article/csharp/28399

    打赏 评论
  • i0703mtf 2018-02-01 03:05

    用了一下c#封装的winpcap(SharpPcap?),定时发送数据,200ms,误差在1ms以下(具体忘了,0.1?或者更小),测试时数据量比较小,比较稳定。

    打赏 评论

相关推荐 更多相似问题