Linux のノンブロッキング tcp ソケットで send() を使用すると、送信バッファがいっぱいの状態以外で EAGAIN が返されますか?
基本的に、ソケット送信バッファーをアプリの唯一のバッファーとして使用するか、ソケット バッファーにフィードするために独自のユーザー空間バッファーが必要かを決定する必要があります。
Linux のノンブロッキング tcp ソケットで send() を使用すると、送信バッファがいっぱいの状態以外で EAGAIN が返されますか?
基本的に、ソケット送信バッファーをアプリの唯一のバッファーとして使用するか、ソケット バッファーにフィードするために独自のユーザー空間バッファーが必要かを決定する必要があります。
そうすべきではありませんが、それがユーザースペースバッファーに関する決定にどのように影響するかはわかりません。EAGAINを取得する具体的な理由に関係なく、アプリの実行内容に応じて、バッファーが必要になるかどうかが決まります。
また、いくつかの計算を行った後、 setsockoptを使用してSO_SNDBUFオプションを使用してtcpバッファサイズを変更し、それが実際にパフォーマンスを向上させるかどうかを確認することもできます。
Linuxの非ブロッキングtcpソケットでsend()を使用すると、send buffer full条件以外の場合はEAGAINが返されますか?
send()は送信バッファがいっぱいの場合にのみブロックするため、条件のみである必要がある非ブロッキングソケット。
それ以外の場合は、私の経験では、カーネルでマイナーな障害が発生したときにEAGAINが返されることがあるため、動作に依存しないことをお勧めしますが、ソケットはまだ問題ありません。最近、カーネルのメモリが不足しているように見えるため、EAGAINが返されたときにHP-UXを使用した経験があります。エラーは回復可能であるため、EAGAINはケースの許容可能なエラーコードです。
EAGAIN/EWOULDBLOCK は、確認応答されていないパケットの数が輻輳ウィンドウに達したときに (TCP ソケットの場合) 返されることもあります。
輻輳ウィンドウに関するソケットのステータスを確認するには、次を試してください。
#include <netinet/tcp.h>
static void print_tcp_cwnd(int socket)
{
struct tcp_info tcp_info;
uint tcp_info_length = sizeof(tcp_info);
if ( getsockopt( socket, SOL_TCP, TCP_INFO, (void *)&tcp_info, &tcp_info_length ) == 0 )
{
printf("tcpi_snd_cwnd: %u, tcpi_unacked: %u\n",
tcp_info.tcpi_snd_cwnd,
tcp_info.tcpi_unacked
);
}
}
その場合tcpi_unacked == tcpi_snd_cwnd
、send() はノンブロッキング ソケットに対して EAGAIN/EWOULDBLOCK を返します。