0

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

我有一个“发送者”应用程序,每秒发送一个数据报。另一个一直在阅读的“接收器”应用程序。它运作良好。

但是如果我都关闭了,从发送者发送一些数据报,关闭它......然后激活接收器,没有什么可以读取的。所以数据报不见了。

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

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

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

4

1 回答 1

2

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

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

当接收程序“关闭”时,没有套接字。因此,尽管操作系统可能会收到 UDP 数据包,但它无法将它们与具有适当地址/端口的打开套接字匹配,从而导致数据包被丢弃。

当接收器“打开”时,它会将接收到的数据包保留在其缓冲区中,直到它读取它们为止。如果缓冲区填满,新的数据包将丢失,直到缓冲区空间被清除。

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

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

于 2021-03-18T13:33:05.787 回答