问题描述
我使用的是 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 不可靠,有时这正是您所需要的(想想电话,您可能更喜欢在元音中间甚至整个单词中出现故障,而不是在纠错时暂停呼叫) .