Linux

如果接收器無法通過套接字處理數據速度會發生什麼?

  • August 10, 2020

我有兩個程序 P1(發送者)和 P2(接收者)。P1 用於unix-domain-socket (UDS)向 P2 發送數據。如果 P1 以 100 條消息/秒的速率發送數據而 P2 能夠接收 50 條消息/秒會發生什麼。兩者都是非阻塞套接字。

在上述情況下發生了什麼?p1 或 p2 會在一段時間後面臨記憶體耗盡嗎?

團隊,請解釋在上述情況下會發生什麼。

謝謝。

如果接收方的讀取速度不如發送方發送的速度,那麼套接字緩衝區會在一段時間後填滿。

當假設數據報套接字類型時,如果緩衝區已滿,阻塞套接字將阻塞,從而隱式減慢發送方的速度。使用非阻塞套接字,消息的發送將失敗,並且EAGAIN將作為錯誤返回send。請注意,這僅適用於數據報類型的 unix 域套接字。使用 UDP 套接字,發送將成功,消息只會失去。

使用流套接字,可能會寫入部分消息,無論套接字是阻塞的還是非阻塞的。發送方需要檢查實際寫入了多少字節(返回send),並確保稍後發送剩餘的數據。對於非阻塞套接字,它send也可能完全失敗EAGAIN,而對於阻塞套接字,它將阻塞並等待接收器讀取一些數據,以便在套接字緩衝區中再次擁有空間。

引用自:https://unix.stackexchange.com/questions/603717