【问题标题】:What is the difference between stream parameter and protocol parameter in socket function?socket函数中流参数和协议参数有什么区别?
【发布时间】:2013-11-14 15:06:57
【问题描述】:
int socket(int domain, int type, int protocol);

据我了解

int domain;

该参数用于传递地址族或协议族。我相信地址族和协议族之间没有重大区别。我们使用它来指定地址类型(IPV4 或 IPv6)。

int type;

该参数用于网络层的UDP、TCP等连接类型。

int protocol;

该参数用于指定TCP、UDP等协议。

我的问题是

第二个参数和第三个参数有什么区别?如果我们使用 TCP 协议,我们将使用 SOCK_STREAM,如果我们使用 UDP 协议,我们将在第二个参数中使用 SOCK_DGRAM。那么为什么在这种情况下需要两个参数呢?为什么我们不使用单个参数而不是两个?

【问题讨论】:

  • 您在一个已删除的问题中询问了有关 C 和数据库的一些问题,但您的问题太不精确以至于它被删除了。请在提问时更加具体和准确。 (例如,至少提到操作系统和实际的数据库软件,如 MySQL 或 PostgreSQL 或 MongoDB 等......)。而上面关于SOCK_STREAM的问题肯定是缺少Linux或Posix标签,因为标准C99(或C11)不知道sockets!!

标签: c sockets


【解决方案1】:

根据手册页,协议是套接字的子类型,大多数类型没有子类型,但有些类型可能有额外的子类型。

例如,如果您有原始套接字类型,则可以指定协议号。

int fd = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);

-MS

【讨论】:

  • 是的,套接字只不过是使用客户端服务器技术连接两个端点,我们可以使用您所说的任何协议来连接它。那么我的问题其实就是为什么连接流和协议类型有两个单独的参数。
  • 我能想到的一个原因是,这样做是为了在应用过滤器来识别数据通信的端点时提供更大的灵活性。用更好的话让它成为未来的证明
  • “识别端点”是什么意思。他们将如何识别使用流类型或协议类型
  • 会有人将它自己注册为该特定类型的上层处理程序。识别端点意味着找出每一层数据的处理程序。例如,对于 tcp 数据包,第一层是以太网,然后是 IP,然后是 TCP 层,然后是实际应用程序,该应用程序已将其自己注册为该端口号的数据所有者。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2010-09-14
  • 2015-08-09
  • 2021-01-22
  • 1970-01-01
相关资源
最近更新 更多