gen_tcp を使用する Erlang では、ソケットを介して送信されたデータを単一のストリームに集約できることを読みました。ソケットに特定のバイト数を正確に送信させるにはどうすればよいですか?
1 に答える
TCP は (パケット指向の UDP とは異なり) ストリーム プロトコルです。つまり、受信アプリケーションは、利用可能なデータがsend()
クライアントの 1 つまたは複数の呼び出しから来たものかどうかを判断できません。
TCP パケットで送信されるバイト数を実際に制御することはできません。複数のsend()
呼び出しで 1 つの TCP パケットが受信されるsend()
可能性があり、1 つの呼び出しで複数の TCP パケットが送信される可能性があります。これは、OS TCP スタックによって制御されます。
Erlang では、socket オプション{packet, 1|2|4}
を使用gen_tcp:connect
しgen_tcp:listen
て、TCP データのパケット指向の処理を作成することができます。これにより、1、2、または 4 バイトのプレフィックスがそれぞれに挿入されsend()
、受信側 (これも erlang で同じ{packet, N}
オプションを使用すると仮定) は、メッセージが TCP にどのように断片化されたかに関係なく、送信されたバイト数が受信されるまでデータを読み取ります。パケット。
の呼び出しgen_tcp:recv
は、予想されるバイト数が読み取られるまでブロックされます。アクティブ モード ソケットの場合も同様に、メッセージは予想されるバイト数で送信されます。