2016-10-27 2 views
-1

Est-il possible d'obtenir l'adresse MAC du client distant via TCPListener en C#?Obtenir l'adresse MAC via TCPListener en C#

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

avez-vous regardé à la bibliothèque d'aide ip https://msdn.microsoft.com/en-us/library/windows/desktop/aa366071 (v = vs.85) .aspx – pm100

+1

Je ne pense pas que ce que vous voulez est possible basé sur le fait qu'une adresse MAC est une adresse de couche 2 (matériel) et ne sera pas accessible en dehors du LAN du périphérique distant. Sur un réseau local, vous pouvez faire un ARP pour obtenir une adresse MAC à partir d'une adresse IP. –

+1

MAC est utilisé dans la couche de liaison de données, pas la couche réseau, donc j'en doute sérieusement. – Amy

Répondre

3

No. L'adresse MAC est une partie de la Link layer, uniquement utilisé pour communiquer deux hôtes dans le même lien physique.

Surimplification ..., imaginons que a et c sont des ordinateurs, et b est un routeur.

a <-> b <-> c 

Si a veut envoyer un paquet à c, il doit passer par b. Donc a envoie le paquet avec l'adresse IP source a, l'adresse IP cible c, l'adresse MAC source a et l'adresse MAC cible b, puisque le routeur est le saut suivant. Ensuite, lorsque b obtiendra ce paquet, il l'enverra à c en utilisant l'adresse IP source a, l'adresse IP cible c, l'adresse MAC source b et l'adresse MAC cible c.

+0

S'il vous plaît, aidez-nous à obtenir du code pour obtenir l'adresse MAC via l'adresse IP puis ... –

+0

@Dimi la réponse dit que vous ne pouvez pas. Est-ce que vous l'avez vu? – Amy

+0

Vous ne pouvez pas obtenir l'adresse MAC via IP. Vous pouvez obtenir les adresses MAC des adresses IP auxquelles vous êtes directement connecté par exemple en utilisant 'arp -a '. Et les moyens directement connectés via un concentrateur ou un commutateur de base. – vtortola

1

Donc, la réponse est non c'est impossible.

Mais par adresse IP, nous pouvons obtenir adresse MAC comme ce

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; 
     } 
    } 
}