書き込まれたデータの量が少ない場合、TCP/IPソケットへの書き込みはアトミックになると私は理解しています。アトミックでは、受信者がすべてのデータを受信するか、データを受信しないことを意味します。ただし、書き込まれるデータの量が多い場合は、アトミックではありません。私は正しいですか?もしそうなら、何が大きなものとみなされますか?アプリによって書かれたすべてのデータが1つのUDPデータグラムで送信されるためTCP/IPソケットはアトミックですか?
おかげで、UDPの場合 ボブ
書き込まれたデータの量が少ない場合、TCP/IPソケットへの書き込みはアトミックになると私は理解しています。アトミックでは、受信者がすべてのデータを受信するか、データを受信しないことを意味します。ただし、書き込まれるデータの量が多い場合は、アトミックではありません。私は正しいですか?もしそうなら、何が大きなものとみなされますか?アプリによって書かれたすべてのデータが1つのUDPデータグラムで送信されるためTCP/IPソケットはアトミックですか?
おかげで、UDPの場合 ボブ
は、それは、本当です。
TCPの場合、アプリケーションが一度に1バイトのデータしか送信しない限り、そうではありません。 TCPソケットに書き込むと、そのソケットに関連付けられているバッファにすべてのデータが書き込まれます。 TCPはそのバッファからバックグラウンドでデータを読み取り、それを受信者に送信します。
、あなたはassum決してすることができますアプリケーションがソケットに書き込むものは、実際に受信者が1回の読み取りで受信します。ソケットのバッファ内のデータは、1つまたは複数のTCPセグメントで受信側に送信できます。データが利用可能になると、受信機はその時点で実際に利用可能なデータであればソケットの読み取りと復帰を実行できます。
もちろん、送信されたすべてのデータは最終的に受信者に届きますが、途中で障害が発生していない場合、受信者がデータを受信する前に接続を閉じたり読み取りを停止しないと、
"*アプリケーションが一度に1バイトのデータしか送信しない限り*" - これはデータがデフォルトでバッファされているため保証されません。 'TCP_NODELAY'ソケットオプションを有効にしない限り、複数の1バイト書き込みを実行して、それらを単一のTCPセグメントで一緒に送信することができます。 –
いずれにしても、1回の受信操作でそれらをすべて受信*できます。 @RemyLebeau – EJP
@EJP:複数のTCPセグメントが受信され、アプリケーションが新しい読み取り操作を実行する前にソケットにバッファリングされている場合は、はい。 –
ボブ、あなたの質問は良いですし、多くのプログラマーは、彼らがTCPソケットでNバイトを送信すると、他のノードはすべてNバイトを読むと思うというエラーがあります。その後、機能テストを実行して動作します。しかし、それはしばらくの間システムに障害を引き起こすバグです。あなたがしたいのは、単純なアプリケーション層プロトコル、通常はTLV(タイプ、長さ、値)を作成することです。ここで説明します(この問題はプログラミング言語で有効です):http://stackoverflow.com/questions/19839172/how-to-read-all-of-inputstream-in-server-socket-java/19863726#19863726 – rodolk