【问题标题】:Why WOL(WakeOnLan) Is Releated To Operating System?为什么WOL(Wake On Lan)与操作系统有关?
【发布时间】:2021-11-07 10:24:27
【问题描述】:

Wikipedia 说:

Wake-on-LAN (WoL) 是一种以太网或令牌环计算机网络标准,允许通过网络消息打开或唤醒计算机。

但是,在另一部分:

Responding to the magic packet ... 大多数 WoL 硬件在功能上通常默认被阻止,需要在使用系统 BIOS 时启用。在某些情况下,需要从操作系统进行进一步配置,例如通过 Windows 操作系统上的设备管理器网卡属性。

为什么?为什么我们还需要在 OS 中启用 WOL?

问题:

当我实现WOL program 以从本地服务器打开网络(通过 LAN 连接)中的其他 PC 时,我的实际问题出现了。但失败了,因为它需要在 PC 中进行一些额外的配置:

  1. 配置因操作系统而异(也因版本而异)。
  2. 有些配置不是永久性的,需要在每次操作系统启动时进行。 (例如:在 Ubuntu 16.04 中我必须运行 ethtool -s eno1 wol g)。

有没有办法绕过操作系统配置,只从 BIOS 设置中启用 WOL?还是代码问题?

WOL 示例:

#include <QByteArray>
#include <QDebug>
#include <QUdpSocket>

#include <thread>

auto sendMagicPacket(QString const& ip, QString const& 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 result;
}

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

【问题讨论】:

    标签: c++ linux windows wake-on-lan


    【解决方案1】:

    仅在没有标准化方法为所有硬件启用 WoL 的情况下才涉及操作系统。因此,您通常需要特定硬件的设备驱动程序才能启用硬件的功能。加载操作系统通常会为您提供这样的设备驱动程序。

    每次启动时运行 ethtool 应该是相当简单的,特别是因为(最后,如果没有记错的话)运行它两次(或更多)应该是无害的,所以你可以将它添加到(例如)你的 .bashrc 中。如果您需要确保它真的只在启动时发生一次,而不是每次登录时,您可以添加一个初始化脚本来执行此操作。 man init-d-script 应该会让你很轻松。

    您必须启用它,因为大多数 BIOS 默认禁用它,因此除非您启用它,否则它将无法工作。

    至于为什么默认禁用它:不太确定,但我猜这只是因为大多数人不使用它。

    【讨论】:

    • 我不明白你的回答。 1) 我们需要一个操作系统来为我们提供 WoL 的设备驱动程序吗? standard hardware 不是可以打开电脑吗?我真的不明白为什么只有使用硬件功能打开PC,与操作系统有关? (如果我们没有操作系统怎么办?)。
    • @GhasemRamezani:只要打开 PC 就没有问题。问题是我们必须告诉网卡检查所有传入的数据包(即使在 PC 关闭的情况下)并在它收到魔术数据包时调用“打开 PC”功能。并且没有标准化的方式(在硬件级别)告诉它这样做,所以我们需要一个设备驱动程序来给我们一个标准化的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多