我有两个进程P1 (发送者)和P2 (接收者)。P1使用unix-domain-socket (UDS)向P2发送数据。如果P1以每秒100条消息的速度发送数据,而P2能够接收50条消息/秒,会发生什么?两者都是非阻塞套接字。
在上述情况下发生了什么?p1或p2会在一段时间后面临内存耗尽吗?
团队,请解释在上面的场景下会发生什么。
谢谢。
发布于 2020-08-10 04:15:13
如果接收方没有发送者发送的读取速度快,那么套接字缓冲区会在一段时间后被填满。
假设数据报套接字类型为数据报套接字类型时,如果缓冲区已满,阻塞套接字将阻塞,从而隐式地减慢发送方的速度。使用非阻塞套接字,消息的发送就会失败,EAGAIN将由send作为错误返回。注意,这仅适用于类型为数据报的unix域套接字。有了UDP套接字,发送就会成功,消息就会丢失。
使用流套接字,无论套接字是阻塞还是非阻塞,都可能写入部分消息。发送方需要检查实际写入的字节数(返回send),并确保稍后发送剩余的数据。使用非阻塞套接字,send也可能在EAGAIN中完全失败,使用阻塞套接字,它将阻塞并等待接收方读取某些数据,以便在套接字缓冲区中再次有空间。
https://unix.stackexchange.com/questions/603717
复制相似问题