2011-12-30 9 views

答えて

3

いいえ、まったくありません。あなたは、ネットワークのすべての処理のためにデータを受け取ったときに何が起こるかを制御することはできません。あなたはどのくらいのあなたのrecvコール(ただし、それは< =送信されることを除いて)を取得するかについての任意の仮定をすることはできません。少しでも1バイトを得ることができます。

+0

私の言いたいことは、(例えば)バッファ "\ 0秒bu"を受け取るということですか? –

+0

答えが「はい」の場合、どのようにして「パケット」を別のものから区別できますか?何らかの種類の終了シーケンスを使用すべきですか? –

+1

はい、あなたもそれを受け取ることができます。あなたはあなたの 'パケット'を区別するためにデータに何かを持っている必要があります。 「パケット」の長さやデリミタの種類(データには表示されません)を送信することができます。 –

0

Windowsソケット(他のTCPベースの抽象化のようなもの)はストリーミングしていません。 Windowsソケットを使用するパケット化された方法を探しています。私はそれに依存しないでしょう http://tangentsoft.net/wskfaq/examples/packetize.html

+0

より正確には、Windows TCPソケットがストリーミングしています。 UDPソケットは代わりにメッセージベースです。 TCPソケット上の各 'send()'はストリームにデータを追加するだけで、ストリーム上の 'send()'と 'recv()'の間には1対1の関係はありません。 UDPソケット上の 'send()'はそれぞれ別個のメッセージを送信し、メッセージには1対1の関係があります。 –

0

はこれを試してみてください。読んでいるときに、一気にそれらを得るかもしれません。パケットの並べ替えやネットワークレイテンシなど、パケットが実際に相手に到着したときに影響を及ぼします。また、2番目のバッファが最初のバッファより速く見つかる可能性があります。最初のものが到着するためにTCPを使用しているか、そうでない場合はない)。そして、到着したものは何でもあなたに与えられます。送信側の方法に依存することなく、受信側でデータを解析する必要があります(TCPは特定のオーダー保証を提供しますが、UDPはそれも行いません)。

0

あなたが望むように、パケットの境界は保持されます。 TCPおよび他のストリームプロトコルの場合、そのような運はありません。

関連する問題