【问题标题】:Does SO_RCVTIMEO affect accept()?SO_RCVTIMEO 会影响accept() 吗?
【发布时间】:2011-05-11 17:21:19
【问题描述】:

SO_RCVTIMEO 选项是否会影响accept(如果超时到期,会导致它返回EAGAINEWOULDBLOCK)?标准是否规定了任何行为?我在 accept 的文档中找不到它或使用选项:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_10_16

【问题讨论】:

  • 我似乎记得答案是否定的,但我不记得上下文是否如此或我读过的东西。 Stevens 只提到 read、readv、recv、recvfrom 和 recvmsg 受到影响。似乎 accept 会受到将在某处记录的选项的影响,因为在某些情况下它会很有用。
  • 另外,在三路完成之前,连接不会进入待处理队列吗?这将否定这一点,因为您是否要返回一个新的套接字。
  • 我在想一个阻塞套接字,当没有连接尝试时accept 花费的时间被阻塞。
  • 我知道,但我认为接收超时对接受意味着什么。在应用程序级别没有什么可以接收的,当它们之间可能存在显着延迟时,接收 SYN/ACK 真的意味着什么吗?基于此的计时器似乎不起作用,这就是为什么我认为 SO_RCVTIMEO 在这种情况下不合适的原因。其他一些计时器机制是合适的,即基于队列中没有任何东西/某物的语义而不是读取缓冲区。

标签: c sockets posix


【解决方案1】:

虽然在 POSIX 上 SO_RCVTIMEO 是为“输入函数”定义的,而 SO_SNDTIMEO 是为“输出函数”定义的,但我找不到“输入函数”或“输出函数”的任何定义,所以我只说他们至少是读/接收和写/发送。

在 Linux 的特定情况下,SO_RCVTIMEO 影响accept(),可以通过查看inet_csk_accept() 看到,SO_SND_TIMEO 影响connect(),可以通过查看tcp_sendmsg() 看到。

【讨论】:

  • +1 并被接受,因为除了其他实现的实现细节之外似乎没有什么可说的了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 2021-04-29
  • 2015-11-28
  • 2011-04-03
相关资源
最近更新 更多