0

I have a terminal and a wifi bridge(to access avaliable wifi spots). Via NetworkInterface I can find ethernet connection with wifi bridge. So now I need to connect to this bridge to get avaliable wifi spots, is it wright or it is already connected(I can see Lan connection)? For connection I need to find MAC and Ip address of this bridge. Is it possible to find dynamically using Net libraries? I was tring managedwifi, but it gives error 1062:

 WlanClient client = new WlanClient();

Any ideas how can I find MAC address of that wifi bridge?

Sasha
  • 833
  • 1
  • 20
  • 40
  • Easy. The MAC is returned in a Ping. From cmd.exe, first ping wifi bridge. The execute >ARP /a. You can see the MAC in the ARP table (returned from Ping). I usually ping the device and then look up IP in ARP table. – jdweng Aug 03 '15 at 10:44

2 Answers2

1

Here is code to get arp table

   public class GetArpTable
    {
        // The max number of physical addresses. 
        const int MAXLEN_PHYSADDR = 8;

       // Define the MIB_IPNETROW structure. 

        struct MIB_IPNETROW 
        {
            public int dwIndex;
            public int dwPhysAddrLen;
            public byte mac0;
            public byte mac1;
            public byte mac2;
            public byte mac3;
            public byte mac4;
            public byte mac5;
            public byte mac6;
            public byte mac7;
            public int dwAddr;
            public int dwType;
        }

        // Declare the GetIpNetTable function.
        [DllImport("IpHlpApi.dll")]
        [return: MarshalAs(UnmanagedType.U4)]

        static extern int GetIpNetTable(
           IntPtr pIpNetTable,
           [MarshalAs(UnmanagedType.U4)] 
         ref int pdwSize,
           bool bOrder);

        // The insufficient buffer error. 
        const int ERROR_INSUFFICIENT_BUFFER = 122;

        static IntPtr buffer;

        static int result;

        public GetArpTable()
        {
            // The number of bytes needed. 
            int bytesNeeded = 0;

            // The result from the API call. 
            result = GetIpNetTable(IntPtr.Zero, ref bytesNeeded, false);

            // Call the function, expecting an insufficient buffer. 
            if (result != ERROR_INSUFFICIENT_BUFFER)
            {
                // Throw an exception. 
                throw new Win32Exception(result);
            }

            // Allocate the memory, do it in a try/finally block, to ensure 
            // that it is released. 
            buffer = IntPtr.Zero;

            // Try/finally. 
            try
            {
                // Allocate the memory. 
                buffer = Marshal.AllocCoTaskMem(bytesNeeded);

                // Make the call again. If it did not succeed, then 
                // raise an error. 
                result = GetIpNetTable(buffer, ref bytesNeeded, false);

                // If the result is not 0 (no error), then throw an exception. 
                if (result != 0)
                {
                    // Throw an exception. 
                    throw new Win32Exception(result);
                }
            }
            finally
            {

            }
          }

         public static string ipstr;
         public static string macname;

         public static void GetNames(IP_Code.LocalHost LocalHost)
         {
            // Now we have the buffer, we have to marshal it. We can read 
            // the first 4 bytes to get the length of the buffer. 
            int entries = Marshal.ReadInt32(buffer);



            // Increment the memory pointer by the size of the int. 
            IntPtr currentBuffer = new IntPtr(buffer.ToInt64() +
               Marshal.SizeOf(typeof(int)));

            // Allocate an array of entries. 
            MIB_IPNETROW[] table = new MIB_IPNETROW[entries];

            // Cycle through the entries. 
            for (int index = 0; index < entries; index++)
            {
                // Call PtrToStructure, getting the structure information. 
                table[index] = (MIB_IPNETROW)Marshal.PtrToStructure(new
                   IntPtr(currentBuffer.ToInt64() + (index *
                   Marshal.SizeOf(typeof(MIB_IPNETROW)))), typeof(MIB_IPNETROW));
            }

            for (int index = 0; index < entries; index++)
            {

                IPAddress ip = new IPAddress((table[index].dwAddr& 0xFFFFFFFF));
                Console.Write("IP:" + ip.ToString() + "\t\tMAC:");


                ipstr = ip.ToString();
                macname = "MAC:";


                byte b;

                b = table[index].mac0;
                if (b < 0x10)
                {
                    Console.Write("0");
                    macname = macname + "0";
                }
                else
                {
                    Console.Write("");
                }
                Console.Write(b.ToString("X"));
                macname = macname + b.ToString("X");

                b = table[index].mac1;
                if (b < 0x10)
                {
                    Console.Write("-0");
                    macname = macname + "-0";
                }
                else
                {
                    Console.Write("-");
                    macname = macname + "-";
                }
                Console.Write(b.ToString("X"));
                macname = macname + b.ToString("X");

                b = table[index].mac2;
                if (b < 0x10)
                {
                    Console.Write("-0");
                    macname = macname + "-0";
                }
                else
                {
                    Console.Write("-");
                    macname = macname + "-";
                }
                Console.Write(b.ToString("X"));
                macname = macname + b.ToString("X");

                b = table[index].mac3;
                if (b < 0x10)
                {
                    Console.Write("-0");
                    macname = macname + "-0";
                }
                else
                {
                    Console.Write("-");
                    macname = macname + "-";
                }
                Console.Write(b.ToString("X"));
                macname = macname + b.ToString("X");

                b = table[index].mac4;
                if (b < 0x10)
                {
                    Console.Write("-0");
                    macname = macname + "-0";
                }
                else
                {
                    Console.Write("-");
                    macname = macname + "-";
                }
                Console.Write(b.ToString("X"));
                macname = macname + b.ToString("X");

                b = table[index].mac5;
                if (b < 0x10)
                {
                    Console.Write("-0");
                    macname = macname + "-0";
                }
                else
                {
                    Console.Write("-");
                    macname = macname + "-";
                }
                Console.Write(b.ToString("X"));
                macname = macname + b.ToString("X");
                Console.WriteLine();

                //test for device
                if (table[index].mac0 == 0x00 && 
                    table[index].mac1 == 0x00 && 
                    table[index].mac2 == 0x00)
                {
                    //if device matches
                }
            }   

         }

         ~GetArpTable()
         {
             // Release the memory. 
             Marshal.FreeCoTaskMem(buffer);
         }

    } ​
jdweng
  • 33,250
  • 2
  • 15
  • 20
  • Not sure what is wrong... I've got arp table from your code. And also we have a default program to set up connection with a wifi bridge. So when I use default programm, I have mac address, that I don't have my arc table. Any ideas how is that possible? – Sasha Aug 03 '15 at 11:14
  • Try ARP from cmd.exe. My code is looking for specify MAC numbers, Put a break on the "if" statement near end of code and see if you reach the break. Check if variable buffer is not null – jdweng Aug 03 '15 at 13:01
  • I found out that default program uses winpcap.dll. Can this cause the difference? – Sasha Aug 03 '15 at 13:24
  • I ping the IP address first. Then check ARP table. Try 1st by opening cmd.exe. Then Ping IP or Name. Then try ARP /a. This will tell if you can get the MAC using my method. You can execute PING from c#. My solution is to ping all IP address in the 256 address subnet. Then find my devices by checking ARP table MAC address to determine the manufacturer of each device that responds to the ping. – jdweng Aug 03 '15 at 13:40
  • I'll try it tommorrow. – Sasha Aug 03 '15 at 13:58
  • Sorry for a late response. I am always getting DestinationHostUnreachable as a response. Any ideas why? – Sasha Aug 05 '15 at 14:32
  • Ping requires a route to destination. Try ping with both IP address and computer name to see if one or both works. Normally IP will work but name will not. Name requires ARP messages to be passed which contains computer names. The router is blocking these messages because they are multicast. Routers only pass by default multicast that is in the subnet determined by the mask. So widening the mask will allow more multicast to pass. Or changing settings in Router to allow multicast to PASS is another option. – jdweng Aug 05 '15 at 14:46
  • Thanks for help. The problem was that we ip address or a mac name. We decided to go another way and to use wlan adapter, and not bridge. – Sasha Aug 06 '15 at 13:39
  • I had similar problems about 12 years ago with a hub. We finally decided it wasn't capable of doing what we wanted and got a different device. We spent days trying to change settings before we gave up. – jdweng Aug 06 '15 at 14:12
0

You need the BSSID, which is the MAC address of the access point. There is another thread explaining something related to wifi and inside it you can find the code to obtain the bssid in c#: C# - How do I access the WLAN signal strength and others?

Community
  • 1
  • 1
rodolk
  • 5,606
  • 3
  • 28
  • 34
  • Managed wifi does not work. I don't have wifi adapter on my terminal, and when I initialize WlanClient I get error 1062 – Sasha Aug 04 '15 at 05:51