- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我试图找出 MAC 地址,并且我设法在 Linux 中使用 sysctl 创建了工作解决方案,问题是,这个解决方案不适用于我正在开发的 FreeBSD 版本。除了使用 sysctl 之外,还有什么方法可以在 C 中找到 mac 地址吗?
最佳答案
使用 libpcap 库。这是您能找到的最多平台的方式。
此库用于网络嗅探器和入侵检测,以及专门测量其他网络统计数据。 nethogs 实用程序用于测量每个进程的网络使用情况,iftop 用于测量每个机器/端口的带宽使用情况。在许多角色中都非常灵活。
用 C 语言编写,但有一些其他语言的包装器。
1 : http://en.wikipedia.org/wiki/Pcap
[2]: http://www.tcpdump.org
[3]:http://sourceforge.net/projects/libpcap/
编辑:这是一个完整、准确且有效的示例,其中包含详细的代码和功能:
http://coderrr.wordpress.com/2008/03/07/get-the-mac-address-of-a-local-ip/
有很多教程,源代码是您最好的 friend 。
编辑 2:blaze 指出 getifaddrs(3)
似乎可以完成这项工作,只是一些警告,它是一个非 posix 函数。是 glibc linux 支持但不提供文档的 bsd 函数。几乎是一个未记录的特色:-)
所有文档都是手册页,来自 kernel.org 上的手册:
Not in POSIX.1-2001. This function first appeared in BSDi and is present on the BSD systems, but with slightly different semantics documented--returning one entry per interface, not per address. This means ifa_addr and other fields can actually be NULL if the interface has no address, and no link-level address is returned if the interface has an IP address assigned. Also, the way of choosing either ifa_broadaddr or ifa_dstaddr differs on various systems.
和
The addresses returned on Linux will usually be the IPv4 and IPv6 addresses assigned to the interface, but also one AF_PACKET address per interface containing lower-level details about the interface and its physical layer. In this case, the ifa_data field may contain a pointer to a struct net_device_stats, defined in , which contains various interface attributes and statistics.
因此它的行为可能会有所不同,您可能必须 #ifndef
进行编译。
kernel.org 手册页位于 http://www.kernel.org/doc/man-pages/online/pages/man3/getifaddrs.3.html确实在其中提供了示例代码,这可能会有所帮助。与上面的链接相比,我的本地 linux 手册页相当差。
我仍然认为 libpcap 更便携,因为其他人已经完成了所有可移植性工作以及您通过使用它获得的所有额外功能。
希望这对您有所帮助。
关于c - 在 C 中找出 Linux 和 FreeBSD 上的 MAC 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8288242/
如果我在 FreeBSD 上,我想编译一些 C 代码。我为此使用了什么#ifdef? 我意识到这是正确的网络搜索应该回答的基本问题,但我找不到正确的搜索词。我看过代码检查 FREEBSD 和/或 __
好的,所以我刚刚读完 FreeBSD 的 kill(2) 的实现,并且正在尝试编写我自己的“kill”。这个系统调用需要 uid和 signum并将信号发送到 uid 拥有的进程,不包括调用进程。 我
如何获取系统中文件描述符的当前计数? 我知道如何获得最大值。 % sysctl kern.maxfiles kern.maxfiles: 8232 引用: http://www.freebsd.org
我继承了一个多台运行 jails 的 FreeBSD6.1 机器的环境。 由于本地网络上的 IP 耗尽,我想更改 jails,以便在物理网络上有 1 个可路由的 IP,而在 jails 之间有另一个不
如何从源代码在 FreeBSD 10.1 x86_64 上记录系统调用(int 0x80 和 sysenter/syscall 的系统调用编号和返回值)? 我知道 truss 可以完成这项工作,但我需
我的电脑上有 Windows、Linux 和 FreeBSD。但不小心我“忘记”在磁盘末尾分配 17 GB 的可用磁盘空间(“坏”Windows 使用了一个小的主恢复分区。因此我现在有 4 个主分区)
我有一个库,我想在 FreeBSD 上测试它。我的 CI 设置没有任何 FreeBSD 系统,添加它们会很困难,但是我可以在我的 CI 脚本中启动一个 VM。 (事实上 ,我已经这样做是为了在更奇
我负责管理一堆服务器,我想在每个服务器上设置我的提示,这样我就不会对我登录的位置感到困惑。 我已经编辑了我的 .cshrc文件并将其放入其中: set prompt=`whoami`@`hostnam
我正在为 FreeBSD 上的服务器编写错误处理代码。对于极其严重的错误,我想通过立即终止来避免数据损坏。很简单,exit(3) .在我退出之前,我输出引导我到达那里的相关变量。但是,理想情况下,此终
在 FreeBSD 系统上,在下面的顶部输出中,mysql 守护进程处于“sbwait”状态。这意味着什么? last pid: 12833; load averages: 0.18, 0.26
我有一个包含/boot/loader* 和/boot/kernel 等的 FreeBSD 镜像。它在 EC2 实例下启动良好,但我想用 Qemu 启动它。我尝试了各种方法,但都没有奏效。见下文。 qe
我倾向于在 Linux 上使用 cscope 和 ctags。我只是在我的源目录中运行 ctags -R 和 cscope -R 开始浏览源代码。 看起来它在 FreeBSD 中有所不同。 任何人请发
我安装了 FreeBSD 虚拟机,然后运行 sudo pkg install clang-devel。然而 clang-format似乎丢失了: -sh: clang-format: not fo
我正在为不使用 Make 的应用程序 ( Cypress ) 创建一个 FreeBSD 端口;相反,它使用 NPM: npm run binary-build-linux cd cli npm run
我在运行 Java 子进程时遇到性能问题Java下,运行在FreeBSD 9.0-RELEASE i386上。 对于该程序,System.exit() 的运行时间约为 2.6 秒。和我不明白为什么。在
我正在阅读 FreeBSD 的源代码,发现它们有 2 个文件可用于创建 MBR - sys/boot/i386/boot0/boot0.S 和 sys/boot/i386/mbr/mbr.S。 从目前
我正在尝试编写一个可移植的安装脚本来为我的编程语言构建编译器。可以看到脚本here : mkdir ArithmeticExpressionCompiler cd ArithmeticExpressi
我目前正在尝试找到一种在 FreeBSD 9.2 上安装包 openjdk8 的方法。为此,我使用了: sudo pkg install openjdk8 它没有任何问题。但是,这也将 perl 包更
在 FreeBSD 8.4 中,pkg 安装无法运行并出现错误。 $ pkg install git pkg:No active remote repositories configured. pkg
我正在考虑为 FreeBSD 编写一个守护程序,但是,我从来没有做过,而且看起来很棘手。 有没有我可以包含的库,然后只为我的守护进程编写特定的东西? 最佳答案 很抱歉发布这个答案而不是评论 - 我没有
我是一名优秀的程序员,十分优秀!