#c #linux #windows #wake-on-lan
Вопрос:
Википедия говорит:
Wake-on-LAN (WoL) — это стандарт компьютерной сети Ethernet или Token Ring, который позволяет включать или пробуждать компьютер с помощью сетевого сообщения.
Но в другом разделе:
Ответ на волшебный пакет … Большинство функций оборудования WoL обычно блокируются по умолчанию и должны быть включены при использовании системного BIOS. В некоторых случаях требуется дополнительная настройка операционной системы, например, через свойства сетевой карты диспетчера устройств в операционных системах Windows.
Почему? почему нам также нужно включить WOL в ОС?
Проблема:
Моя реальная проблема возникает, когда я внедряю программу WOL для включения других компьютеров в сети(подключенных по локальной сети) с локального сервера. Но потерпел неудачу, потому что ему нужны некоторые дополнительные конфигурации на ПК:
- Конфигурации отличаются от ОС к ОС (и от версии к версии).
- Некоторые конфигурации не являются постоянными и должны выполняться при каждом запуске операционной системы. (например: в Ubuntu 16.04 мне пришлось бежать
ethtool -s eno1 wol g
).
Есть ли какой-либо способ обойти конфигурации ОС и включить WOL только в настройках BIOS? Или это проблема с кодом?
Пример WOL:
#include <QByteArray>
#include <QDebug>
#include <QUdpSocket>
#include <thread>
auto sendMagicPacket(QString constamp; ip, QString constamp; mac)
{
std::pair<bool, QString> result = {true, ""};
///
/// note Constants are from
/// https://en.wikipedia.org/wiki/Wake-on-LAN#Magic_packet
///
constexpr auto magicPacketLength = 102;
constexpr auto payloadLength = 6;
constexpr auto payloadValue = static_cast<char>(0xFF);
constexpr auto defaultPort = 9; // Could be 0, 7, 9
char toSend[magicPacketLength];
for (int i = 0; i < payloadLength; i)
{
toSend[i] = payloadValue;
}
auto const macSplited = mac.split(':');
auto const macLength = macSplited.size();
for (int j = payloadLength; j < magicPacketLength; j = macLength)
{
for (int i = 0; i < macLength; i)
{
toSend[i j] = static_cast<char>(macSplited[i].toUInt(nullptr, 16));
}
}
QUdpSocket socket;
auto const writtenSize =
socket.writeDatagram(toSend, magicPacketLength, QHostAddress(ip), defaultPort);
if (writtenSize != magicPacketLength)
{
result = {false, "writtenSize(" QString::number(writtenSize)
") != magicPacketLength("
QString::number(magicPacketLength)
"): " socket.errorString()
};
}
return resu<
}
int main()
{
for (int i = 0; i < 5; i)
{
auto const result = sendMagicPacket("192.168.11.31", "1c:1c:1e:1f:19:15");
if (not result.first)
{
qDebug() << result.second;
}
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
Ответ №1:
Операционная система задействована только в той мере, в какой не существует стандартизированного способа включения WoL для всего оборудования. Поэтому обычно требуется драйвер устройства для конкретного оборудования, чтобы иметь возможность включить возможности оборудования. Загрузка ОС обычно дает вам такой драйвер устройства.
Запуск ethtool при каждом запуске должен быть довольно тривиальным, тем более, что (наконец, если память не изменяет) запуск его дважды (или более) должен быть безвредным, поэтому вы можете добавить его (для одного примера) в свой .bashrc. Если вам нужно убедиться, что это действительно происходит только один раз при запуске, а не каждый раз при входе в систему, вы можете добавить для этого скрипт инициализации. man init-d-script
должно заставить тебя довольно легко двигаться.
Вы должны включить его, потому что большинство BIOS по умолчанию оставляют его отключенным, поэтому, если вы его не включите, он не будет работать.
Относительно того, почему отключить его по умолчанию: менее определенно, но я предполагаю, что это просто потому, что большинство людей им не пользуются.
Комментарии:
1. Я не понял вашего ответа. 1) Нам нужна ОС, чтобы предоставить нам драйвер устройства для WoL? Разве это не стандартная аппаратная возможность просто включить компьютер? Я действительно не понимаю, почему единственное включение ПК, использующего аппаратные возможности, связано с операционной системой? (Что делать, если у нас нет операционной системы?).
2. @GhasemRamezani: Просто включить компьютер-это не проблема. Проблема в том, что мы должны сообщить сетевой карте, чтобы она проверяла все входящие пакеты (даже когда компьютер выключен), и вызывала функцию «включить компьютер», когда он получает волшебный пакет. И нет стандартизированного способа (на аппаратном уровне) сказать ему об этом, поэтому нам нужен драйвер устройства, чтобы предоставить нам стандартизированный способ.