UNIX域套接字:是否存在"忙"信号?

jld*_*ont 4 sockets unix-socket

可以在客户端通过一个UNIX域套接字(AF_UNIX型)推送数据用信号发送,如果接收端无法与负载应付?

要么

必须在套接字顶部有一个Client-Server协议来处理流量控制吗?

jtc*_*tty 8

您绝对可以阻止发送到UNIX域套接字.如果接收方的接收缓冲区已满,或者未完成(未传送)的发送套接字缓冲区数太高,则发送方将阻塞.

SOCK_STREAM UNIX域套接字的工作方式类似于TCP套接字.SOCK_DGRAM UNIX域套接字的工作方式与UDP类似,不同之处在于UNIX域数据报具有有保证的有序传递,而UDP套接字可以重新排序或删除.(此外,UNIX域套接字可用于发送文件描述符并在进程之间传递用户凭据,这些都不能通过TCP,UDP或管道完成.)

因此,由于所有类型的UNIX域套接字都保证了按顺序传送,接收器可以在忙于执行其他操作时停止接收,并且当没有可用的缓冲区空间时将自动阻止发送方(或将通知没有更多的缓冲区空间,如果它们请求对其套接字进行非阻塞操作).然后,当接收者再次开始接收时,发送者将被允许发送更多.


Dav*_*ris 1

除非您将其包含在协议中,否则服务器无法告诉客户端暂停发送信息。

  • 这个答案是完全错误的。如果AF_UNIX套接字是用SOCK_STREAM打开的,那么服务器可以简单地停止从套接字读取;然后客户端将阻塞 send() 或 write() 直到服务器准备好读取更多内容。如果客户端不想阻塞,它可以使用 select() 来查看服务器是否准备好接收更多数据。 (8认同)
  • @Jean-Lou:这是正确的。`AF_UNIX` 绝对不提供流量控制语义。底层设备可能会提供缓冲区溢出条件,从而导致“send()”返回错误,但这是特定于设备的。 (2认同)