Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets UNIX域套接字:是否有“一个”这样的东西;“忙”;信号?_Sockets_Unix Socket - Fatal编程技术网

Sockets UNIX域套接字:是否有“一个”这样的东西;“忙”;信号?

Sockets UNIX域套接字:是否有“一个”这样的东西;“忙”;信号?,sockets,unix-socket,Sockets,Unix Socket,如果接收端无法处理负载,那么通过UNIX域套接字(AF_UNIX类型)推送数据的客户端是否可以发出忙信号 或 套接字上必须有一个客户端-服务器协议来处理流控制吗?除了服务器知道什么时候“忙”并发送特定信号(例如HTTP的503服务不可用)之外。您还可以将客户端连接设置为在一定时间后超时,如果您收到超时事件,请将其解释为服务器正忙。除非您在协议中包含此项,服务器无法通知客户端暂停发送信息。您完全可以对UNIX域套接字执行阻止发送。如果接收方的接收缓冲区已满,或者未完成(未送达)的发送套接字缓冲区数

如果接收端无法处理负载,那么通过UNIX域套接字(AF_UNIX类型)推送数据的客户端是否可以发出忙信号


套接字上必须有一个客户端-服务器协议来处理流控制吗?

除了服务器知道什么时候“忙”并发送特定信号(例如HTTP的503服务不可用)之外。您还可以将客户端连接设置为在一定时间后超时,如果您收到超时事件,请将其解释为服务器正忙。

除非您在协议中包含此项,服务器无法通知客户端暂停发送信息。

您完全可以对UNIX域套接字执行阻止发送。如果接收方的接收缓冲区已满,或者未完成(未送达)的发送套接字缓冲区数量过高,则发送方将阻塞

SOCK_STREAM UNIX域套接字的工作方式与TCP套接字类似。SOCK_DGRAM UNIX域套接字的工作方式与UDP类似,只是UNIX域数据报保证按顺序交付,而UDP套接字可以重新排序或删除。(此外,UNIX域套接字可用于在进程之间发送文件描述符和传递用户凭据,而TCP、UDP或管道都无法完成这两项工作。)


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

…这种行为通常适用于套接字或特定于AF_INET?(我这样问是因为您使用HTTP的示例)PS如果套接字“connect”调用无法在给定的超时时间内建立连接,则ETIMEDOUT是您从该调用中得到的;设置sockopt SO_SNDTIMEO和时间是您配置该调用的方式(如果您不想要默认值)。然后,主机可能实际上已关闭。让您的客户端处于这种状态对监视进程的人来说是非常误导的。(假设它是任务关键型的)AF_UNIX连接无需超时。除非收件人关闭其套接字,否则数据包传递是有保证的。要进行流量控制,只需停止接收数据包,它们将排队等待,直到您准备再次开始接收数据包。如果队列“已满”,最终将停止发件人发送数据包(对发送函数的调用将阻止或返回EAGAIN)。轮询(使用poll、select等)将指示发送方的套接字不可写。当接收方再次开始接收时,发送方套接字将再次变为可写。不需要应用层协议。因此,实际上套接字是FIFO,没有流控制:流控制需要上层协议(如果需要).TCP/IP知道的不多。为控制消息编写处理程序(您也必须编写这些消息)是唯一的方法。@Jean Lou:这是正确的。
AF\u UNIX
绝对不提供流控制语义。底层设备可能会提供缓冲区溢出情况,从而导致
send()
返回一个错误,但该错误是特定于设备的。此答案完全错误。如果使用SOCK\u流打开AF\u UNIX套接字,则服务器可以简单地停止从套接字读取;然后,客户端将在发送()或写入()时阻塞,直到服务器准备读取更多。如果客户端不想阻塞,则可以使用select()查看服务器是否已准备好接收更多数据。是否有一些方法可以使用XON/XOFF?您可以在顶部使用任何您想要的协议,这可以包括发送XON/XOFF字符。但是内核不会对它们做任何特殊处理。它只是像其他字节一样传递它们。