首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么WOL(WakeOnLan)会被升级到操作系统?

为什么WOL(WakeOnLan)会被升级到操作系统?
EN

Stack Overflow用户
提问于 2021-09-11 05:58:03
回答 1查看 220关注 0票数 1

维基百科说:

局域网上的唤醒(WoL)是一种以太网或令牌环计算机网络标准,允许计算机被网络消息打开或唤醒。

但是,在另一节中:

对魔法包的响应 ...大多数WoL硬件通常在默认情况下被阻塞,需要在使用系统BIOS时启用。在某些情况下,需要从操作系统进一步配置,例如通过Windows操作系统上的设备管理器网卡属性进行配置。

为什么?为什么我们还需要在操作系统中启用WOL?

问题是:

当我实现WOL程序从本地服务器打开网络(由局域网连接)中的其他PC时,我的实际问题就出现了。但是失败了,因为它需要PC中的一些额外配置:

  1. 这些配置从OS到OS (以及版本到版本)是不同的。
  2. 有些配置不是永久性的,需要在每一个操作系统启动时完成。(例如:在Ubuntu16.04中,我不得不运行ethtool -s eno1 wol g)。

是否有任何方法可以绕过OS配置,只允许BIOS设置中的WOL?还是密码问题?

例如:

代码语言:javascript
复制
#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));
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-11 07:06:51

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

运行每个启动程序都应该相当简单,特别是因为(如果内存正常的话)运行两次(或更多)应该是无害的,所以您可以将它添加到.bashrc中(举个例子)。如果您需要确保它只在启动时发生一次,而不是每次登录时,您可以添加一个init脚本来这样做。man init-d-script应该能让你走得很容易。

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

为什么在默认情况下禁用它:不太确定,但我的猜测是,这只是因为大多数人不使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69140443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档