В чем практическая разница между заголовками <linux / in.h> и <netinet / in.h>? - PullRequest
10 голосов
/ 22 февраля 2012

Насколько я заметил, обе библиотеки состоят из более чем 90% одинаковых точных кодов. Когда я объявляю их в моих примерах программ, никакой магии не происходит. Я не совсем понимаю разницу между этими библиотеками, даже если они находятся в отдельных каталогах. Может кто-нибудь разбить их для меня?

Plus: Я попытался объявить linux / in.h выше sys / socket.h, компилятор жужжал как «не могу найти указанный квалифицированный список для sa_family_t», что означает, что sa_family_t не определен в области linux / in.h, если вызывается в таким образом ...

Затем я попробовал то же самое для netinet / in.h, ну, это работает независимо от того, где декларация.

Ответы [ 3 ]

13 голосов
/ 22 февраля 2012

Заголовки linux/*.h действительно предназначались для внутреннего использования в ядре, и если бы Linux создавался сегодня, эти файлы даже не существовали бы под /usr/include. Но на ранних этапах многие пользовательские пространства libc (в то время libc4 и libc5) полагались на заголовки Linux для определения типов, констант, структур и т. Д. Для использования в пользовательском пространстве, поэтому netinet/in.h содержал только #include <linux/in.h> или аналогичный, и прекрасная традиция началась. Сегодня единственными заголовками в дереве linux, которые следует использовать для приложений пользовательского пространства, являются некоторые вещи, связанные с поддержкой определенного оборудования на низком уровне, например консоли Linux, framebuffer, video4linux и т. Д.

Короче говоря, вы должны использовать netinet/in.h (стандартный заголовок, указанный в POSIX) и делать вид, что вы никогда не видели linux/in.h. : -)

1 голос
/ 22 февраля 2012

Из заголовка для <<a href="http://lxr.oss.org.cn/source/include/linux/in.h" rel="nofollow"> linux / in.h >:

* Authors:     Original taken from the GNU Project <netinet/in.h> file.
*              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>

Он предназначен для кода ядра, который работает в сети. Используйте в своем собственном коде.

0 голосов
/ 22 февраля 2012

Они делают почти одно и то же, но одно довольно стандартное, другое нет.

netinet присутствует во многих никсах BSD *, и * и никсах даже до BSD, поэтому linux выбираетиметь очень похожий интерфейс для netinet, чтобы код можно было переносить.

...