如果接收端无法应对负载,客户端是否可以通过 UNIX 域套接字(AF_UNIX 类型)推送数据?
或者
套接字之上必须有一个客户端-服务器协议来处理流量控制吗?
如果接收端无法应对负载,客户端是否可以通过 UNIX 域套接字(AF_UNIX 类型)推送数据?
或者
套接字之上必须有一个客户端-服务器协议来处理流量控制吗?
您绝对可以将阻塞发送到 UNIX 域套接字。如果接收方的接收缓冲区已满,或者未完成(未交付)的发送套接字缓冲区数量过多,则发送方将阻塞。
SOCK_STREAM UNIX 域套接字的工作方式类似于 TCP 套接字。SOCK_DGRAM UNIX 域套接字的工作方式与 UDP 类似,不同的是 UNIX 域数据报保证按顺序交付,而 UDP 套接字可以重新排序或丢弃。(此外,UNIX 域套接字可用于发送文件描述符并在进程之间传递用户凭据,这两者都不能通过 TCP、UDP 或管道完成。)
所以,因为所有类型的 UNIX Domain Sockets 都保证了按顺序发送,所以接收者可以在忙于做其他事情时停止接收,当没有更多可用的缓冲区空间时发送者将被自动阻塞(或将被通知如果他们在套接字上请求非阻塞操作,则没有更多的缓冲区空间)。然后,当接收者再次开始接收时,发送者将被允许发送更多。
除非您将其包含在协议中,否则服务器无法告诉客户端暂停发送信息。
除了服务器知道它何时“忙”并返回特定信号(例如 HTTP 的 503 服务不可用)之外。您还可以将客户端连接设置为在一定时间后超时,如果您收到超时事件,则将其解释为服务器正忙。