1
yhj
2024-07-24 5e5d945e91568b973faa27d8ab0bcef99fc4a6c5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#region
 
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
 
#endregion
 
namespace CSFrameworkV5.Common
{
    /// <summary>
    ///     C#网络工具类,获取IP/MAC地址
    /// </summary>
    public class NetTools
    {
        /// <summary>
        ///     获取本机IP
        /// </summary>
        /// <returns></returns>
        public static string GetLocalIP()
        {
            var ipe = Dns.GetHostEntry(Dns.GetHostName());
            foreach (var IP in ipe.AddressList)
                if (IP.AddressFamily == AddressFamily.InterNetwork)
                    return IP.ToStringEx();
 
            return "";
        }
 
        /// <summary>
        ///     获取第一个MAC地址
        /// </summary>
        /// <returns></returns>
        public static string GetLocalMac()
        {
            var macs = GetMacByNetworkInterface();
            if (macs.Count > 0) return macs[0];
 
            return "";
        }
 
        /// <summary>
        ///     通过NetworkInterface读取网卡Mac
        /// </summary>
        /// <returns></returns>
        public static List<string> GetMacByNetworkInterface()
        {
            var macs = new List<string>();
            var interfaces = NetworkInterface.GetAllNetworkInterfaces();
            foreach (var ni in interfaces)
                macs.Add(ni.GetPhysicalAddress().ToStringEx());
 
            return macs;
        }
 
        /// <summary>
        ///     根据本地IP地址获取MAC地址(Windows API函数方式)
        /// </summary>
        /// <param name="IP"></param>
        /// <returns></returns>
        public static string GetMACFromIP(string IP)
        {
            var strRet = "Unknown";
 
            var strIPPattern = @"^\d+\.\d+\.\d+\.\d+$";
 
            var objRex = new Regex(strIPPattern);
 
            if (objRex.IsMatch(IP))
            {
                var intDest = inet_addr(IP);
                var arrMAC = new int[2];
                var intLen = 6;
 
                var intResult = SendARP(intDest, 0, ref arrMAC[0], ref intLen);
 
                if (intResult == 0)
                {
                    var arrbyte = new byte[8];
                    arrbyte[5] = (byte)(arrMAC[1] >> 8);
                    arrbyte[4] = (byte)arrMAC[1];
                    arrbyte[3] = (byte)(arrMAC[0] >> 24);
                    arrbyte[2] = (byte)(arrMAC[0] >> 16);
                    arrbyte[1] = (byte)(arrMAC[0] >> 8);
                    arrbyte[0] = (byte)arrMAC[0];
 
                    var strbMAC = new StringBuilder();
 
                    for (var intIndex = 0; intIndex < 6; intIndex++)
                    {
                        if (intIndex > 0) strbMAC.Append("-");
 
                        strbMAC.Append(arrbyte[intIndex].ToString("X2"));
                    }
 
                    strRet = strbMAC.ToString();
                }
            }
 
            return strRet;
        }
 
        [DllImport("Ws2_32.dll")]
        private static extern int inet_addr(string ip);
 
        [DllImport("Iphlpapi.dll")]
        private static extern int SendARP(int dest, int host, ref int mac,
            ref int length);
    }
}