タイトルにあるように、コネクション型ソケットに一度に書き込むことができるバイト数に制限はありますか?
たとえば、1024バイトのバッファを送信したい場合、
write(tcp_socket, buffer, 1024);
write()
または、それぞれのバイト数が少ない複数の呼び出しを使用する必要がありますか?
write()
すべてのバイトが書き込まれることを保証するものではないため、への複数の呼び出しwrite()
が必要です。男から書く:
たとえば、基になる物理メディアに十分なスペースがない場合、RLIMIT_FSIZEリソース制限に遭遇した場合(setrlimit(2)を参照)、または呼び出しが信号ハンドラーによって中断された場合、書き込まれたバイト数はカウントより少なくなる可能性があります。 countバイト未満を書き込んだ。(pipe(7)も参照してください。)
write()
書き込まれたバイト数を返すため、書き込まれたバイトの現在の合計を維持し、インデックスとして使用して、buffer
書き込まれる残りのバイト数を計算する必要があります。
ssize_t total_bytes_written = 0;
while (total_bytes_written != 1024)
{
assert(total_bytes_written < 1024);
ssize_t bytes_written = write(tcp_socket,
&buffer[total_bytes_written],
1024 - total_bytes_written);
if (bytes_written == -1)
{
/* Report failure and exit. */
break;
}
total_bytes_written += bytes_written;
}
私の経験から、1024バイトの制限にとどまる方が良いです
実際に書き込むことができる量は、ソケットのタイプによって異なります。一般に、実際に書き込まれたバイト数を確認するには、戻り値を確認する必要があります。書き込まれるバイト数は、ソケットがブロッキングモードであるかどうかによって異なります。
また、ソケットがブロックしている場合は、すべてのデータが一度に書き込まれるのを待ちたくない場合があります。書き込み操作の合間に何か他のことを実行できるようにするために、一度にいくつかを書き込みたい場合があります。
固有の制限はありません。TCP / IPは、必要に応じてパケットをフラグメント化して再構成します。お使いのシステムは(おそらく調整可能な)上限を課しているかもしれませんが、それはマルチMBの範囲にある可能性があります。setsockopt()のマンページを参照し、write()の戻り値を常に確認してください。
ご覧のとおり、書き込みソケットの最大バッファサイズは1048576バイトです。