【问题标题】:why does <linux/socket.h> file not define socket types?为什么 <linux/socket.h> 文件没有定义套接字类型?
【发布时间】:2012-04-23 10:02:15
【问题描述】:

Linux 提供的头文件“/usr/include/linux/socket.h”包含支持的地址族和协议族的定义:

/* Supported address families. */
#define AF_UNSPEC       0
....

/* Protocol families, same as address families. */
#define PF_UNSPEC       AF_UNSPEC
...

但是为什么它没有定义套接字类型呢?

我可以在“/usr/include/bits/socket.h”中找到它的定义

enum sock_type {
    SOCK_DGRAM  = 1,
    SOCK_STREAM = 2,
    SOCK_RAW    = 3,
    SOCK_RDM    = 4,
    SOCK_SEQPACKET  = 5,
    SOCK_DCCP   = 6,
    SOCK_PACKET = 10,
};

不知道为什么Linux提供的头文件中没有定义这些?

【问题讨论】:

  • 你怎么只编译 gcc filename.c 不够
  • 我是直接调用Linux系统调用。我注意到 SOCK_DGRAM 没有在 Linux 提供的头文件中定义。想知道为什么它没有在Linux头文件中定义。
  • 正如 Alnitak 所说,通过 POSIX,标头是 并且如果您 #include 您将可以访问正确的定义。不要只是查找它们并使用数字。
  • 没错。宏名称可能与 POSIX 定义的宏相同,也可能不同。但是,这些套接字类型的数字应该在 Linux 附带的任何头文件中定义。不是吗?
  • 如果你查看“/usr/src/kernels//include/linux/net.h”文件,你会看到 SOCK_DGRAM 等的定义。我想知道为什么会这样没有在 Linux 附带的头文件中定义?

标签: c sockets


【解决方案1】:

用户空间程序应该使用:

#include <sys/socket.h>

注意:sys,而不是 linux

这将#include 适当的低级头文件。

一些定义在&lt;bits/socket.h&gt; 和一些在&lt;linux/socket.h&gt; 中的事实只是一个实现细节。

【讨论】:

  • 同意。我正在制作自己的套接字库,需要直接调用系统调用。我想知道为什么 Linux 头文件上没有定义套接字类型。 是 Linux 提供的头文件,而 是 GNU C 库的一部分。我不知道为什么 Linux 提供的头文件中没有定义套接字类型。
  • @Dew 啊,我明白你的意思 - 我怀疑 SOCK_* 值是在某个标准中定义的(POSIX?),因此即使底层操作系统不是 Linux 也应该是一致的.
  • 是的,SOCK_* 的值由 POSIX 定义,应在系统库中定义,而不是在操作系统提供的库中定义。但是,C 运行时库。必须将套接字类型传递给可能不同的系统调用。问题是库编写者如何确定支持的套接字类型和与之关联的整数值?不能只假设 POSIX 为内核使用的 sock 类型定义的常量。如果是的话,应该写在某个地方。不是吗?
  • 据我了解,POSIX 标准指的是 API 而不是系统调用。套接字类型套接字系统调用的输入。因此,支持的 Socket 类型(作为宏)应该由内核公开。不是吗?
  • @DewKumar 的重点是,虽然内核 internal可能 不同,但不重新使用定义的 POSIX 将是非常愚蠢的值。
猜你喜欢
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 2019-09-02
  • 2012-01-30
相关资源
最近更新 更多