0

こんにちは私はこのプログラムをコンパイルしようとします:

    #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:そのようなファイルまたはディレクトリのコンパイルは終了しませんでした。

なんで?この図書館はどこにありますか?

4

1 に答える 1

0

それはあなたのシステムが不平を言っていないのと同じ場所にあるべきです。dlpi_ether.h

これは、C自体ではなく、作業している環境に大きく依存するため、実際にはCの質問ではありません。私たちが言えるのは、そのヘッダーファイルがないということだけです。

OSのようなUNIXを使用している場合は、次のようなもので探しに行くことができます。

find /usr/include -name 'dlpi*.h'

Oracleからのこのリンクに基づくと、これらのヘッダーファイルはLinuxにはまったく存在しない可能性があります。

生のイーサネットを読み取るコードは、Solaris OSとLinuxで大きく異なります(libpcapを使用して、FreeBSD、HP-UX、AIXなどの他のシステムとの違いを調べることもできます)。

libpcapの該当するコードは、pcap-linux.cおよびpcap-dlpi.cにあります。DLPIコードは、Solaris、HP-UX、AIX、およびその他のオペレーティングシステムで使用されます。Linuxは、標準のソケット呼び出しを介してrawソケットパケットを読み取るためのメカニズムを提供します。Solaris OSは、getmsg(2)およびputmsg(2)呼び出しを使用して、DLPIパケットを送受信します。

于 2012-04-13T08:30:39.893 に答える