您好我尝试编译此程序:
#include <sys/types.h>
#include <sys/dlpi_ether.h>
#include <sys/dlpi_common.h>
#include <stropts.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
int fd, status;
struct strioctl strcmd;
unsigned char addr[6];
fd = open(argv[1],0,0);
if (fd == -1) {
perror("enaddr: open");
exit(1);
}
strcmd.ic_cmd = DLIOCGENADDR;
strcmd.ic_timout = 0;
strcmd.ic_len = sizeof(addr);
strcmd.ic_dp = addr;
status = ioctl(fd,I_STR,&strcmd);
if (status == -1) {
perror("enaddr: ioctl");
exit(1);
}
printf("%02.2x:%02.2x:%02.2x:%02.2x:%02.2x:%02.2x\n",addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
}
#include <sys/types.h>
#include <sys/dlpi_ether.h>
#include <sys/dlpi_common.h>
#include <stropts.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
int fd, status;
struct strioctl strcmd;
unsigned char addr[6];
fd = open(argv[1],0,0);
if (fd == -1) {
perror("enaddr: open");
exit(1);
}
strcmd.ic_cmd = DLIOCGENADDR;
strcmd.ic_timout = 0;
strcmd.ic_len = sizeof(addr);
strcmd.ic_dp = addr;
status = ioctl(fd,I_STR,&strcmd);
if (status == -1) {
perror("enaddr: ioctl");
exit(1);
}
printf("%02.2x:%02.2x:%02.2x:%02.2x:%02.2x:%02.2x\n",addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
}
终端返回此致命错误:
prova.c:3:30:致命错误:sys / dlpi_common.h:没有这样的文件或目录 编译终止。
为什么呢?这个图书馆在哪里?
答案 0 :(得分:0)
应与dlpi_ether.h
位于同一个地方,系统不会抱怨。
这不是一个真正的C问题,因为它很大程度上取决于你工作的环境而不是C本身。我们只能说你没有头文件。
如果您在类似操作系统的UNIX下,可以使用以下内容进行查找:
find /usr/include -name 'dlpi*.h'
根据Oracle的this link,这些头文件似乎根本不在Linux中:
在Solaris OS和Linux之间读取原始以太网的代码非常不同(libpcap也可用于检查与其他系统的差异,例如FreeBSD,HP-UX和AIX)。
libpcap中的适用代码位于pcap-linux.c和pcap-dlpi.c。 DLPI代码用于Solaris,HP-UX,AIX和其他操作系统。 Linux提供了一种通过标准套接字调用读取原始套接字数据包的机制。 Solaris OS使用getmsg(2)和putmsg(2)调用来接收和发送DLPI数据包。