-2

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

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

4

2 回答 2

6

内核会将数据包放入套接字的接收缓冲区,等待应用程序读取它们。当该缓冲区填满时,内核开始丢弃新的数据报。

于 2012-11-26T17:44:40.057 回答
5

内核会将传入的数据包排队到某个限制,这可以通过设置 SO_RCVBUF 套接字选项在客户端上进行控制。当达到限制时,额外的数据包将被丢弃,内核可能会向发送者发送一个 Source Quench ICMP 消息。没有标准的方法可以在每个套接字的基础上进行控制。如果发送了 Source Quench 消息,您可以使用 IP_RECVERR 套接字选项在服务器上读取它们。

如果您什么都不做,那么 Source Quench 消息(如果已发送)可能会被忽略,尽管服务器的内核可能会在发送套接字上触发错误。但是,我不知道有任何操作系统可以执行此类操作。

一般来说,发送不需要的数据是浪费的,不应该这样做——客户端数据包可能包含一个比特,告诉服务器客户端是否期待响应,从而避免整个问题。

于 2012-11-26T18:03:21.293 回答