gpt4 book ai didi

c++ - setsockopt 参数 SO_RCVTIMEO 中的阻塞意味着什么

转载 作者:行者123 更新时间:2023-11-30 01:23:59 27 4
gpt4 key购买 nike

当我从 msdn link 查看 setsockopt 时.我遇到了一个参数 SO_RCVTIMEO,它的描述是“设置超时,以毫秒为单位,用于阻止接收调用。”我认为套接字监听操作是事件驱动的,这意味着当内核从 NIC 卡中耗尽帧时通知我的程序套接字,那么阻塞是怎么回事?

最佳答案

recv 和 WSARecv 函数是阻塞的。它们不是事件驱动的(至少不是在调用级别)。即使阻塞有超时(使用 SO_RECTIMEO 选项设置),就您的代码而言,它们也不是事件驱动的。在那种情况下,它们只是伪阻塞(可以说是非阻塞,具体取决于超时时间有多短)。

当您调用 WSARecv 时,它将等待数据准备好读取。当数据还没有准备好被读取时,它只是等待。这就是它被认为是阻塞的原因。


您说得对,网络的核心是事件驱动的。在引擎盖下,计算机本质上是事件驱动的。这就是硬件的工作方式。硬件中断本质上是事件。你是对的,在低层次上发生的事情是你的 NIC 卡告诉操作系统它已准备好被读取。在那个层面上,它确实是基于事件的。

问题是 WSARecv 等待那个事件。


这是一个希望很清楚的类比。想象一下,由于某种原因你不能离开你的房子。现在想象你的 friend F 住在隔壁。此外,假设您的另一个 friend G 在您家。

现在想象一下,您给 G 一张纸,上面有一个问题,让他把纸交给 F。

问题发送后,假设您派 G 去获取 F 的答复。这就像 recv 调用。 G会等到F写下他的回复,然后他会把它带给你。如果F还没有写好,G不会马上掉头回来。

这就是差距的来源。 G确实知道“F写了!”事件,但你不是。你不是在直接看那张纸。

设置超时意味着您告诉 G 在放弃并返回之前最多等待一段时间。在这种情况下,G 仍在等待 F 写入,但如果 F 在 x 毫秒内没有写入,G 将转身空手而归。

基本上recv的伪代码大概是这样的:

1) is data available?
1a) Yes: read it and return
1b) No: GOTO 2
2) Wait until an event is received
2a) GOTO 1

我知道这是一个非常令人费解的解释,但我的主要观点是:recv 与事件交互,而不是您的代码。 recv block ,直到收到这些事件之一。如果设置了超时,它会阻塞,直到收到这些事件之一,达到超时。

关于c++ - setsockopt 参数 SO_RCVTIMEO 中的阻塞意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14249557/

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