在C中,我有一个简单的服务器/客户端UDP套接字编程示例。 客户端以高速率向服务器发送数据包,而服务器读取每个传入的消息并将其发送回客户端。 客户端永远不会读取任何传入消息。
有没有理由相信发送回客户端的数据包会填满客户端的缓冲区?如果客户没有阅读任何内容,他们究竟会发生什么?他们会立即放弃吗?
答案 0 :(得分:6)
内核会将数据包放入socket的接收缓冲区,期望应用程序读取它们。当缓冲区填满时,内核开始丢弃新的数据报。
答案 1 :(得分:5)
内核会将传入的数据包排队到某个限制,这可以通过设置SO_RCVBUF套接字选项在客户端上控制。达到限制时,将丢弃其他数据包,内核可能会将Source Quench ICMP消息发送回发送方。在每个插槽的基础上没有标准的控制方式。如果发送了Source Quench消息,您可以使用IP_RECVERR套接字选项在服务器上读取它们。
如果你什么都不做,那么Source Quench消息(如果发送的话)可能会被忽略,尽管服务器的内核可能会在发送套接字上触发错误。但是,我不知道有任何类似的操作系统。
一般情况下,发送不需要的数据是浪费的,不应该这样做 - 客户端数据包可能包含一个位告诉服务器客户端是否期望响应,从而避免了整个问题。