如何使用 C 程序获取机器的 MAC 地址?

2024-06-10

这个问题和这个问题完全一样:如何使用 C 程序获取机器的 MAC 地址? https://stackoverflow.com/questions/1779715/how-to-get-mac-address-of-your-machine-using-a-c-program

“我正在 Ubuntu 上工作。我如何使用 C 程序获取我的机器的 MAC 地址或接口(如 eth0)。”


现在,我通常不接触 C...但在这种情况下我必须这样做。由于我真的不知道以下代码(取自上面链接的答案)中发生了什么,因此我需要一些帮助。

#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <netdb.h>
#include <stdio.h>

int main()
{
  struct ifreq s;
  int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);

  strcpy(s.ifr_name, "eth0");
  if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) {
    int i;
    for (i = 0; i < 6; ++i)
      printf(" %02x", (unsigned char) s.ifr_addr.sa_data[i]);
    puts("\n");
    return 0;
  }
  return 1;
}

我需要一个将 MAC 地址作为字符串返回的函数,而不是打印 MAC 地址的函数。你知道,像这样:

const char * gettaStringFromNativeCode(void) 
{
    return "This is a string";
}

这是要与Mozilla 无铬版 https://github.com/mozilla/chromeless,它使用 Firefox 的新 JCTYPES,例如this https://github.com/mozilla/chromeless/tree/master/examples/jsctypes.

基本上,我想做这样的事情(借用 C#):

// Using "string" here because its pseudo-code and I don't know what i'm doing. :-)
string getMAC()
{
  struct ifreq s;
  int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);

  strcpy(s.ifr_name, "eth0");
  var macAddress = string.Empty; // yah, this is actually C#
  if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) {
    int i;
    for (i = 0; i < 6; ++i)
       // yah, this is a bit of C# too.
      macAddress += string.Format(" %02x", (unsigned char) s.ifr_addr.sa_data[i]) );
  }
  return macAddress;
}

#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <netdb.h>
#include <stdio.h>

char *getmac(char *iface)
{
#define MAC_STRING_LENGTH 13
  char *ret = malloc(MAC_STRING_LENGTH);
  struct ifreq s;
  int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);

  strcpy(s.ifr_name, iface);
  if (fd >= 0 && ret && 0 == ioctl(fd, SIOCGIFHWADDR, &s))
  {
    int i;
    for (i = 0; i < 6; ++i)
      snprintf(ret+i*2,MAC_STRING_LENGTH-i*2,"%02x",(unsigned char) s.ifr_addr.sa_data[i]);
  }
  else
  {
    perror("malloc/socket/ioctl failed");
    exit(1);
  }
  return(ret);
}

int main()
{
  char *mac = getmac("eth0");
  printf("%s\n",mac);
  free(mac);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 C 程序获取机器的 MAC 地址? 的相关文章

随机推荐

  • HttpGet 401 状态代码后跟 200 状态代码

    我使用 Apachage HttpComponent 访问 Web 服务时遇到奇怪的行为 我可以访问服务器日志 当我尝试连接到服务器并执行 httpGet 命令时 我可以在日志中首先看到 401 状态 http 未经授权 然后看到 200
  • 如何创建为数据库中的每个视图调用 sp_refreshview 的存储过程?

    今天我运行这个 select exec sp refreshview N table schema table name from information schema tables where table type view 这会生成很多
  • JSON.stringify() 和 JavaScript 对象

    我想也许我错过了 JavaScript 中的一些东西 而我现在才刚刚开始学习 我在 Chrome 控制台中尝试了以下代码 a a name test JSON stringify a which returns value a new Ob
  • 如何在 Android 中使用最新的 NanoHTTPD 2.3.0 提供 mp3 文件?

    我读过了如何使用 NanoHTTPD 在 sdcard 上提供文件 在 Android 内部 https stackoverflow com questions 19359304 how to serve a file on sdcard
  • 将参数传递给 GWT bootstrap .nocache.js 脚本

    有没有办法将参数传递给 GWT 生成的 nocache js 脚本文件并在 onModuleLoad 函数中对其进行评估 就像这样 主机页 URL 应与内部工作的 GWT 内容完全分离 因此将 appId 参数作为主机页的查询参数传递并使用
  • 如何分别为python3和python2设置不同的PYTHONPATH变量

    我只想为 python2 添加特定的库路径 添加后export PYTHONPATH path to lib to my bashrc但是 执行 python3 会出现错误 您的 PYTHONPATH 指向 Python 2 x 的站点包目
  • 使用 Javascript 将消息添加到 p:growl

    我想使用 Javascript 在客户端显示咆哮声 我的意思是这个 UI 组件 我找到了这个thread https stackoverflow com questions 5730054 how to display notificati
  • 如何查看 iPhone 磁盘空间?

    我正在创建一个 iPhone 性能应用程序 其中我想知道 iPhone 上可用的磁盘空间 我知道很多应用程序都这样做 但我似乎无法在任何地方找到这一点 float getTotalDiskSpaceInBytes float totalSp
  • 从 Windows 任务计划程序在虚拟环境中运行 python 脚本

    我正在尝试通过 Windows 任务计划程序设置重复的 Python 任务 当我输入 python exe 的路径并将脚本的路径作为参数提供给 Windows 任务计划程序时 我已经成功了 参见下面的屏幕截图 但是 我希望能够选择一个特定的
  • MSVC 可能/不太可能等效

    GCC 编译器支持 builtin expect 语句 用于定义可能和不可能的宏 eg define likely expr builtin expect expr 1 define unlikely expr builtin expect
  • MySQL:向大表添加字段

    我有一个包含大约 200 000 条记录的表 我想向其中添加一个字段 ALTER TABLE table ADD param 21 BOOL NOT NULL COMMENT about the field AFTER param 20 但
  • WebStorm 中的断点未命中 JavaScript 调试

    我在 WebStorm 中有以下配置设置 当我单击 调试 时 它会正常启动 Chrome 并导航到该页面 但我的断点从未被命中 但它以某种方式连接起来 因为我看到了所有console log WebStorm 中的输出 我正在尝试导航到屏幕
  • 根据条件格式化货币

    Google Apps 脚本新手 但有一些 VBA 编码经验 我希望能够根据不同的单元格输入决定单元格的数字格式 eg Col A 客户名称 验证范围 B 栏 货币类型 英镑 美元 欧元 经过验证的列表 Col C 费用 100 用户免费类
  • webkit 和 moz 有什么区别

    我不明白之间的区别 webkit animation and moz animation 两者之间有什么区别 或者是相同的 我用谷歌搜索了这个问题 但找不到差异 这是代码示例 blink me font size 60px font wei
  • 如何在加载到页面之前初始化聚合物元素的国际化

    我正在使用 Dart 构建 Polymer 应用程序 由于我在 Polymer 元素中使用 Dart 的国际化功能 因此我想在创建 Polymer 元素之前初始化国际化消息 并在 Polymer 元素中显示给定区域设置的适当消息 如何才能做
  • R中引用和表达式的区别

    gettypes function x paramx substitute x print typeof paramx print class paramx print mode paramx gettypes expression sin
  • 在 Visual Studio 2017 中使用 .wid 文件

    我已经使用 Visual Studio 2017 Professional 创建了一个安装项目 vdproj file 我想使用本页中建议的密码对话框 https www codeproject com Tips 659367 Passwo
  • 使用 tcp/ip 在真实手机上使用 adb logcat

    我可以使用 adb 通过 wifi 使用 tcp ip 从 Android 手机转储日志吗 可以使用 adb connect 但它需要在手机上运行一些服务器 在 5555 端口 我如何启动这个服务器 或者从手机获取日志的唯一方法是将其连接为
  • AVAudioPCMBuffer 的播放段

    我正在为 iOS 应用程序创建这个简单的录音机和编辑器界面 音频被记录到用于创建波形的浮点数组中 记录后 我将浮点数据复制到AVAudioPCMBuffer用来玩AVAudioPlayerNode 我能够从一开始就播放缓冲区 但我不知道如何
  • 如何使用 C 程序获取机器的 MAC 地址?

    这个问题和这个问题完全一样 如何使用 C 程序获取机器的 MAC 地址 https stackoverflow com questions 1779715 how to get mac address of your machine usi