UDP数据包未读取会发生什么?

Ric*_*son -2 c sockets buffer udp

在C中,我有一个简单的服务器/客户端UDP套接字编程示例.客户端以高速率向服务器发送数据包,而服务器读取每个传入的消息并将其发送回客户端.客户端永远不会读取任何传入的消息.

有没有理由相信发送回客户端的数据包会填满客户端的缓冲区?如果客户没有阅读任何内容,他们究竟会发生什么?它们会立即被丢弃吗?

Nik*_*sov 6

内核会将数据包放入socket的接收缓冲区,期望应用程序读取它们.当缓冲区填满时,内核开始丢弃新的数据报.


Chr*_*odd 5

内核会将传入的数据包排队到某个限制,这可以通过设置SO_RCVBUF套接字选项在客户端上控制.达到限制时,将丢弃其他数据包,内核可能会将Source Quench ICMP消息发送回发送方.在每个插槽的基础上没有标准的控制方式.如果发送了Source Quench消息,您可以使用IP_RECVERR套接字选项在服务器上读取它们.

如果你什么也不做,那么Source Quench消息(如果发送的话)可能会被忽略,尽管服务器的内核可能会在发送套接字上触发错误.但是,我不知道有任何类似的操作系统.

通常,发送不需要的数据是浪费的,不应该这样做 - 客户端数据包可能包含一个位告诉服务器客户端是否期望响应,从而避免了整个问题.