gpt4 book ai didi

c - 奇怪的 Linux 套接字协议(protocol)行为

转载 作者:太空狗 更新时间:2023-10-29 11:39:35 26 4
gpt4 key购买 nike

使用 socket() 时,我对 Linux 协议(protocol)定义之间的差异感到有点困惑。 .我正在尝试使用 socket(PF_INET, SOCK_STREAM, proto) 监听 TCP 连接, 其中proto是(在我看来)有争议的,或者至少看起来很奇怪。

来自 <netinet/in.h> :

...
IPPROTO_IP = 0, /* Dummy protocol for TCP. */
...
IPPROTO_TCP = 6, /* Transmission Control Protocol. */
...

同意/etc/protocols :

ip      0       IP              # internet protocol, pseudo protocol number
hopopt 0 HOPOPT # hop-by-hop options for ipv6
...
tcp 6 TCP # transmission control protocol
...

我从在线教程中学习,从手册页中学习 tcp(7)您使用

初始化 TCP 套接字
tcp_socket = socket(AF_INET, SOCK_STREAM, 0);

它工作得很好,当然 是一个 TCP 套接字。使用上述参数初始化套接字的一件事是代码

struct timeval timeout = {1, 0};
setsockopt(tcp_socket, 0, SO_RCVTIMEO, &timeout, sizeof(timeout); // 1s timeout
// Exactly the same for SO_SNDTIMEO here

工作得很好,但在用 socket() 替换所有协议(protocol)参数(包括 IPPROTO_TCP 中的)之后 ,而不是 IPPROTO_IP他们有,如上所述。

所以在尝试了差异之后,我需要问几个搜索问题:

  1. 为什么,当我用 IPPROTO_TCP 替换所有协议(protocol)参数时,当协议(protocol) 0 显然只是一个“虚拟”TCP 时,设置超时时我会收到错误 92(“协议(protocol)不可用”)吗?
  2. 为什么 socket()当该信息(总是?)从协议(protocol)中隐式知道时,是否需要它应该是流、数据报还是原始套接字的信息,反之亦然? (即 TCP 是一种流协议(protocol),UDP 是一种数据报协议(protocol),...)
  3. “虚拟 TCP”是什么意思?
  4. 什么是 hopopt ,为什么它与“ip”具有相同的协议(protocol)号?

非常感谢。

最佳答案

将 0 作为 socket 的协议(protocol)仅意味着您要为 family/socktype 对使用默认协议(protocol)。在这种情况下,它是 TCP,因此您会得到与 IPPROTO_TCP 相同的结果。

您的错误出在 setsockopt 调用中。正确的应该是

setsockopt(tcp_socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); // 1s timeout

0 不是用于协议(protocol),而是用于选项级别。 IPPROTO_TCP 是另一个选项级别,但您不能将其与 SO_RCVTIMEO 结合使用。它只能与 SOL_SOCKET 一起使用。您与 IPPROTO_TCP 一起使用的是 tcp(7) 中列出的那些,例如TCP_NODELAY

关于c - 奇怪的 Linux 套接字协议(protocol)行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7346695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com