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

问题描述

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

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

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

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

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

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

解决方法

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

当您打开具有特定地址和端口的 UDP 套接字(使用 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ListaDeclaracoes> <declaracaoImportacao> <adicao> <condicaoVendaValorMoeda>000000000000293</condicaoVendaValorMoeda> <condicaoVendaValorReais>000000000001832</condicaoVendaValorReais> <mercadoria> <numeroSequencialItem>01</numeroSequencialItem> <quantidade>00000000500000</quantidade> <unidadeMedida>Unidade </unidadeMedida> <valorUnitario>00000000000005872800</valorUnitario> </mercadoria> <pisPasepAliquotaValorDevido>000000000000038</pisPasepAliquotaValorDevido> <pisPasepAliquotaValorRecolher>000000000000038</pisPasepAliquotaValorRecolher> </adicao> <cargaPesoBruto>000000284900000</cargaPesoBruto> <cargaPesoLiquido>000000253015700</cargaPesoLiquido> </declaracaoImportacao> </ListaDeclaracoes> socket())时,会为该套接字创建一个缓冲区并链接到该特定地址/端口。操作系统会将与地址/端口匹配的所有传入数据包保存到该套接字的缓冲区中。

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

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

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

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