受信側がソケット経由のデータ速度を処理できない場合はどうなりますか?

受信側がソケット経由のデータ速度を処理できない場合はどうなりますか?

2 つのプロセス P1 (送信側) と P2 (受信側) があります。P1 はunix-domain-socket (UDS)P2 にデータを送信するために使用します。P1 が 100 メッセージ/秒の速度でデータを送信し、P2 が 50 メッセージ/秒の速度で受信できる場合はどうなるでしょうか。どちらも非ブロッキング ソケットです。

上記のシナリオでは何が起こっているのでしょうか? しばらくすると p1 または p2 のメモリが枯渇するのでしょうか?

チーム、上記のシナリオで内部的に何が起こるのか説明してください。

ありがとう。

答え1

受信側が送信側ほど速く読み取らない場合、しばらくするとソケット バッファーがいっぱいになります。

データグラム ソケット タイプを想定すると、ブロッキング ソケットはバッファがいっぱいになるとブロックし、暗黙的に送信者の速度を低下させます。非ブロッキング ソケットでは、メッセージの送信は単に失敗し、EAGAINによってエラーとして返されますsend。これは、データグラム タイプの Unix ドメイン ソケットにのみ当てはまることに注意してください。UDP ソケットでは、送信は成功しますが、メッセージは失われます。

ストリーム ソケットでは、ソケットがブロッキングか非ブロッキングかに関係なく、部分的なメッセージが書き込まれる可能性があります。送信側は、実際に書き込まれたバイト数 ( の戻り値send) を確認し、残りのデータを後で送信する必要があります。非ブロッキング ソケットでは、sendも で完全に失敗する可能性がありますがEAGAIN、ブロッキング ソケットでは、代わりに はブロックされ、ソケット バッファーに再びスペースを確保するために、受信側がデータを読み取るのを待機します。

関連情報