我的程序包含一个等待UDP消息的线程,当收到消息时,它会在返回监听之前运行一些函数.我担心错过了一条消息,所以我的问题就是这样,在发送消息后可以读取多长时间?例如,如果在线程运行函数时发送了消息,那么如果函数足够短,是否仍然可以读取它?我在这里寻找指导方针,但是也可以在几微秒内得到答案.
当您的计算机收到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,而不会因处理而停止.