UDP 数据报在套接字中存储多长时间?

How long are UDP datagrams stored in a socket?

我在 openSUSE Linux (v15.1),使用 berkeley 套接字。

我有一个每秒发送一个数据报的“发送器”应用程序。另一个一直读取的“接收器”应用程序。效果不错。

但是如果我都关闭了,从发送方发送一些数据报,将其关闭...然后激活接收方,没有任何内容可以读取。所以数据报不见了。

我需要这个,因为我正在以给定的速度读取数据报,我需要确保其中至少有一个留在那儿。

我发现套接字上设置了“接收缓冲区”,您可以使用“getsockopt”读取和更改输入和输出缓冲区的信息,并且使用“setsockopt”更改它们。

但是当我读取套接字时,即使我知道发送了一些东西,也没有任何东西。那么 包裹在那里存放了多长时间?。我找不到任何方法来检查或更改“getsockopt”选项中的此项。

您的问题的答案是 OS 将 不会 保存任何收到的数据包,除非您有一个打开的套接字。如果您有一个打开的套接字,只要套接字打开,它的缓冲区就会一直存在。该套接字的接收数据包将保留在缓冲区中,直到被读取。

当您打开具有特定地址和端口的 UDP 套接字时(使用 socket()bind()),将为该套接字创建一个缓冲区并链接到该特定 address/port。 OS 会将所有与 address/port 匹配的传入数据包保存到该套接字的缓冲区。

虽然接收器程序处于“关闭”状态,但没有套接字。因此,尽管 OS 可能会收到 UDP 数据包,但它无法将它们与具有适当 address/port 的开放套接字匹配,从而导致数据包被丢弃。

当接收器处于“打开”状态时,它将在其缓冲区中保留接收到的数据包,直到它读取它们。如果缓冲区已满,新数据包将丢失,直到缓冲区 space 被清除。

I need this because I'm reading the datagrams at a given speed and I need to be sure that at least one of them stays there.

UDP 不可靠,这有时正是您所需要的(想一想电话,您可能更愿意在元音甚至整个单词的中间出现故障,而不是在纠正错误时暂停通话本身)。