评论说
net/if.h
是 GNU C 库的一部分,而linux/if.h
则表示它是“为 LINUX 操作系统实现 TCP/IP 协议套件的一个实现”。但是为什么会有两个并且它们各自有什么用处呢?最初,它们都提供了数据结构来管理网络接口。 linux/if.h
更专门地与 Linux 内核的网络接口交互。实际上,文件开头就说明了这一点:
/*
* INET An implementation of the TCP/IP protocol suite for the LINUX
* operating system. INET is implemented using the BSD Socket
* interface as the means of communication with the user level.
*
* Global definitions for the INET interface module.
*/
net/if.h
是 glibc 的文件,用于同样的目的,并且最初更加注重 用户空间
。
需要注意的是,如果您要同时使用它们(它们共享某些结构但不是全部),包含顺序非常重要,在大多数情况下建议先包含 linux/if.h
再包含 net/if.h
。
linux/if.h
是内核的一部分(或从内核导入到libc中),而net/if.h
是C库的一部分。
因此,net/if.h
是进程可见的内容,而linux/if.h
是内核希望看到的内容。内核内部(不看libc)包含内核标头。net/if.h
是您的高级网络工具所包含的内容。:-)
很久以前,两者之间存在不兼容性问题。这导致ifconfig等工具不能正常工作。当前(大约10-15年)它们已经被很好地集成并保持向后兼容。