Как отправить пакет WOL (или что-нибудь вообще) через nic, который не имеет никакого IP-адреса?

lateinit var mClickListener: ClickListener

fun setOnItemClickListener(aClickListener: ClickListener) {
    mClickListener = aClickListener
}

interface ClickListener {
    fun onClick(pos: Int, aView: View)
}

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
    override fun onClick(v: View) {
        mClickListener.onClick(adapterPosition, v)
    }
    val tvTitle = itemView.findViewById<TextView>(R.id.tv_cat_title)

    init {
        itemView.setOnClickListener(this)
    }
}

и в своей деятельности просто внедрите прослушиватель щелчков

adapter.setOnItemClickListener(object : Adapter.ClickListener {
                            override fun onClick(pos: Int, aView: View) {

   }
})
7
задан Tarnay Kálmán 21 April 2009 в 22:26
поделиться

3 ответа

Кажется, что я нашел решение. Можно использовать winpcap для введения пакетов к любому интерфейсу. И существует хорошая обертка для .NET: http://www.tamirgal.com/home/dev.aspx?Item=SharpPcap

(Я предпочел бы решение, которое требует, чтобы никакие дополнительные библиотеки не были установлены...),

ОБНОВЛЕНИЕ: Вот то, что я предстал перед отправкой пакета WOL во всех интерфейсах:

//You need SharpPcap for this to work

private void WakeFunction(string MAC_ADDRESS)
{
    /* Retrieve the device list */
    Tamir.IPLib.PcapDeviceList devices = Tamir.IPLib.SharpPcap.GetAllDevices();

    /*If no device exists, print error */
    if (devices.Count < 1)
    {
        Console.WriteLine("No device found on this machine");
        return;
    }

    foreach (NetworkDevice device in devices)
    {
        //Open the device
        device.PcapOpen();

        //A magic packet is a broadcast frame containing anywhere within its payload: 6 bytes of ones
        //(resulting in hexadecimal FF FF FF FF FF FF), followed by sixteen repetitions 

        byte[] bytes = new byte[120];
        int counter = 0;
        for (int y = 0; y < 6; y++)
            bytes[counter++] = 0xFF;
        //now repeat MAC 16 times
        for (int y = 0; y < 16; y++)
        {
            int i = 0;
            for (int z = 0; z < 6; z++)
            {
                bytes[counter++] =
                    byte.Parse(MAC_ADDRESS.Substring(i, 2),
                    NumberStyles.HexNumber);
                i += 2;
            }
        }

        byte[] etherheader = new byte[54];//If you say so...
        var myPacket = new Tamir.IPLib.Packets.UDPPacket(EthernetFields_Fields.ETH_HEADER_LEN, etherheader);

        //Ethernet
        myPacket.DestinationHwAddress = "FFFFFFFFFFFFF";//it's buggy if you don't have lots of "F"s... (I don't really understand it...)
        try { myPacket.SourceHwAddress = device.MacAddress; }
        catch { myPacket.SourceHwAddress = "0ABCDEF"; }//whatever
        myPacket.EthernetProtocol = EthernetProtocols_Fields.IP;

        //IP
        myPacket.DestinationAddress = "255.255.255.255";
        try { myPacket.SourceAddress = device.IpAddress; }
        catch { myPacket.SourceAddress = "0.0.0.0"; }
        myPacket.IPProtocol = IPProtocols_Fields.UDP;
        myPacket.TimeToLive = 50;
        myPacket.Id = 100;
        myPacket.Version = 4;
        myPacket.IPTotalLength = bytes.Length - EthernetFields_Fields.ETH_HEADER_LEN;           //Set the correct IP length
        myPacket.IPHeaderLength = IPFields_Fields.IP_HEADER_LEN;

        //UDP
        myPacket.SourcePort = 9;                
        myPacket.DestinationPort = 9;           
        myPacket.UDPLength = UDPFields_Fields.UDP_HEADER_LEN;


        myPacket.UDPData = bytes;
        myPacket.ComputeIPChecksum();
        myPacket.ComputeUDPChecksum();

        try
        {
            //Send the packet out the network device
            device.PcapSendPacket(myPacket);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }

        device.PcapClose();
    }
}
8
ответ дан 6 December 2019 в 21:21
поделиться

WOL сделан MAC, не IP. Вот пример.

2
ответ дан 6 December 2019 в 21:21
поделиться

.NET действует в качестве виртуальной машины (CLR), таким образом, это абстрагирует далеко большую часть базовой реальной машины. Например, это только обеспечивает интерфейсы для TCP и сетей UDP, которые намного выше в стопке сетевого протокола это, что Вы обсуждаете. Вы смогли находить сторонний компонент, который обеспечивает доступ к интерфейсу низшего уровня, но я не рассчитывал бы на него (я посмотрел в прошлом для.NET и Java).

Для доступа к тому низко в стопке сетевого протокола, вероятно, необходимо будет кодировать в C к соответствующим системным вызовам ОС. Можно найти это самым легким в Python, и можно уже найти эту функциональность реализованной в или сторонних библиотеках Python. Например, я предлагаю смотреть на Скрученные сетевые библиотеки. Это было одной из причин, что я переключился на Python для большой части моей работы.

С наилучшими пожеланиями.

0
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: