2016-10-27 23 views
-1

是否有可能通过C#中的TCPListener获取远程客户端的MAC地址?通过C#中的TCPListener获取MAC地址#

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 
using System.Text; 

namespace TCPserver 
{ 
    class Program 
    { 
     private const int BUFSIZE = 32; 

     static void Main(string[] args) 
     { 
      if (args.Length > 1) // Test for correct of args 
       throw new ArgumentException("Parameters: [<Port>]"); 

      int servPort = (args.Length == 1) ? Int32.Parse(args[0]) : 7; 

      TcpListener listener = null; 

      try 
      { 
       // Create a TCPListener to accept client connections 
       listener = new TcpListener(IPAddress.Any, servPort); 
       listener.Start(); 
      } 
      catch (SocketException se) 
      { 
       Console.WriteLine(se.Message); 
       Environment.Exit(se.ErrorCode); 
      } 

      byte[] rcvBuffer = new byte[BUFSIZE]; // Receive buffer 
      int bytesRcvd; // Received byte count 

      for (; ;) 
      { // Run forever, accepting and servicing connections 

       TcpClient client = null; 
       NetworkStream ns = null; 
       try 
       { 
        client = listener.AcceptTcpClient(); // Get client connection 
        ns = client.GetStream(); 
        Console.Write("Handling client - "); 

        // Receive until client closes connection 
        int totalBytesEchoed = 0; 
        while ((bytesRcvd = ns.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0) 
        { 
         ns.Write(rcvBuffer, 0, bytesRcvd); 
         totalBytesEchoed += bytesRcvd; 
        } 
        Console.WriteLine("echoed {0} bytes.", totalBytesEchoed); 

        ns.Close(); 
        client.Close(); 

       } 
       catch (Exception e) 
       { 
        Console.WriteLine(e.Message); 
        ns.Close(); 
       } 
      } 
     } 
    } 
} 
+1

你看IP帮助库https://msdn.microsoft.com/en-us/library/windows/desktop/aa366071 (v = vs.85).aspx – pm100

+1

根据MAC地址是第2层(硬件)地址并且不能在远程设备的局域网外访问的事实,我不认为您想要什么。在本地网络上,您可以执行ARP从IP地址获取MAC地址。 –

+1

MAC用于数据链路层,而不是网络层,所以我非常怀疑它。 – Amy

回答

3

号的MAC地址是Link layer的一部分,仅用于在同一物理链路通信的两个主机。

过分简化...,想象一下,ac是计算机,而b是路由器。

a <-> b <-> c 

如果a想要将数据包发送到c,它要经过b。因此a发送源IP地址为a,目标IP地址为c,源MAC地址为a和目标MAC地址为b的数据包,因为路由器是下一跳。然后当b获得该数据包时,它将使用源IP地址a,目标IP地址c,源MAC地址b和目标MAC地址c将其发送到c

+0

请帮助获取一些代码,通过IP地址获取MAC地址然后... –

+0

@Dimi答案说你不能。你读过它吗? – Amy

+0

您无法通过IP获取MAC地址。您可以获得您直接连接的IP地址的MAC地址,例如使用'arp ​​-a '。并通过集线器或基本交换机直接连接。 – vtortola

1

所以答案是否定的,这是不可能的。

但是通过IP地址,我们可以得到MAC地址这样

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication14 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IPAddress address = IPAddress.Parse("12.3.0.42"); 
      byte[] t = GetMacAddress(address); 
      string mac = string.Join(":", (from z in t select z.ToString("X2")).ToArray()); 
      Console.WriteLine(mac); 
      Console.ReadLine(); 
     } 

     [DllImport("iphlpapi.dll", ExactSpelling = true)] 
     public static extern int SendARP(uint destIP, uint srcIP, byte[] macAddress, ref uint macAddressLength); 

     public static byte[] GetMacAddress(IPAddress address) 
     { 
      byte[] mac = new byte[6]; 
      uint len = (uint)mac.Length; 
      byte[] addressBytes = address.GetAddressBytes(); 
      uint dest = ((uint)addressBytes[3] << 24) 
       + ((uint)addressBytes[2] << 16) 
       + ((uint)addressBytes[1] << 8) 
       + ((uint)addressBytes[0]); 
      if (SendARP(dest, 0, mac, ref len) != 0) 
      { 
       throw new Exception("The ARP request failed."); 
      } 
      return mac; 
     } 
    } 
}