これに対する答えが見つかりません: ソケットから 4 バイト (4 バイトの制限を設定) を読み取るとどうなりますか? 実際には 256 バイトが読み取られるのを待っていますか? それらは失われますか、それとも read 関数の次の呼び出しまで待機しますか?
2 に答える
TCP ソケットの場合、データが失われることはありません。行列になります。
read()
部分的な読み取り、つまり、要求されたよりも少ないバイトを取得し、それ以上取得するために再度呼び出す必要がある場合に対処する準備ができている必要があることに注意してください。
使用するソケットの種類によって異なります。ストリーム ソケット (SOCK_STREAM で作成) の場合、データのストリームをサポートし、1 バイトでも読み取ることができます (効率的ではありませんが)。別の側では、1024 バイトを要求しても 1 しか取得できません。そして、送信者がそれらをストリームに入れる部分とはほとんど無関係です(依存関係がありますが、それに依存するべきではありません)。したがって、ストリームでは、上位レベルのプロトコルでデータの終わりを定義する必要があります。最後に \n を含む文字列を送信するか、ゼロで終了する文字列を使用するか、そのデータの前に来るデータのサイズのいくつかのバイトを送信することができます。
一方、データグラム プロトコル (SOCK_DGRAM で作成) を使用すると、送信者が送信したサイズに関係なく、パケット単位でデータを取得できます。使用可能なデータよりも小さいバッファーを指定すると、切り捨てられ、残りのデータは破棄されます。