recv()函数在UDP中缓冲多长时间?

时间:2014-03-19 22:11:48

标签: c udp

我的程序包含一个等待UDP消息的线程,当收到消息时,它会在返回监听之前运行一些函数。我担心错过了一条消息,所以我的问题就是这样,在发送消息后可以读取多长时间?例如,如果在线程运行函数时发送了消息,如果函数足够短,是否仍然可以读取它?我在这里寻找指导方针,但是也可以在几微秒内得到答案。

1 个答案:

答案 0 :(得分:5)

当您的计算机收到UDP数据包(并且至少有一个程序侦听该数据包中指定的UDP端口)时,TCP堆栈会将该数据包的数据添加到与该套接字关联的固定大小的缓冲区中,保留在内核的内存空间中。数据包的数据将保留在该缓冲区中,直到程序调用recv()来检索它。

问题在于,如果您的计算机收到UDP数据包并且缓冲区内没有足够的可用空间来容纳新UDP数据包的数据,那么计算机只会丢弃UDP数据包 - 允许这样做因为UDP不保证数据包将到达。

因此,在数据包开始被丢弃之前,程序必须调用recv()的时间取决于套接字内核数据包缓冲区的大小,数据包的大小以及数据包的速率。被接受。

请注意,您可以通过调用以下内容来要求内核使其接收缓冲区大小更大:

size_t bufSize = 64*1024;   // Dear kernel:  I'd like the buffer to be 64kB please!
setsockopt(mySock, SOL_SOCKET, SO_RCVBUF, &bufSize, sizeof(bufSize));  

...这可能会帮助您避免丢失数据包。如果这还不够,您需要确保您的程序快速返回到recv(),或者可能在一个单独的线程中进行网络I / O处理。