:データを同じチャンクで送受信しますか?私のクライアントから
send(socket, "this is a buffer", ...);
send(socket, "second buffer", ...);
私のサーバーから、recv
は"second buffer'
からs
を持つ別のチャンクを"this is a buffer"
からr
と1つのチャンクを終了し、開始することが保証されていますか?
:データを同じチャンクで送受信しますか?私のクライアントから
send(socket, "this is a buffer", ...);
send(socket, "second buffer", ...);
私のサーバーから、recv
は"second buffer'
からs
を持つ別のチャンクを"this is a buffer"
からr
と1つのチャンクを終了し、開始することが保証されていますか?
いいえ、まったくありません。あなたは、ネットワークのすべての処理のためにデータを受け取ったときに何が起こるかを制御することはできません。あなたはどのくらいのあなたのrecvコール(ただし、それは< =送信されることを除いて)を取得するかについての任意の仮定をすることはできません。少しでも1バイトを得ることができます。
Windowsソケット(他のTCPベースの抽象化のようなもの)はストリーミングしていません。 Windowsソケットを使用するパケット化された方法を探しています。私はそれに依存しないでしょう http://tangentsoft.net/wskfaq/examples/packetize.html
より正確には、Windows TCPソケットがストリーミングしています。 UDPソケットは代わりにメッセージベースです。 TCPソケット上の各 'send()'はストリームにデータを追加するだけで、ストリーム上の 'send()'と 'recv()'の間には1対1の関係はありません。 UDPソケット上の 'send()'はそれぞれ別個のメッセージを送信し、メッセージには1対1の関係があります。 –
:
はこれを試してみてください。読んでいるときに、一気にそれらを得るかもしれません。パケットの並べ替えやネットワークレイテンシなど、パケットが実際に相手に到着したときに影響を及ぼします。また、2番目のバッファが最初のバッファより速く見つかる可能性があります。最初のものが到着するためにTCPを使用しているか、そうでない場合はない)。そして、到着したものは何でもあなたに与えられます。送信側の方法に依存することなく、受信側でデータを解析する必要があります(TCPは特定のオーダー保証を提供しますが、UDPはそれも行いません)。
指定されたバイト数を受信するまでrecvをブロックしたい場合は、フラグMSG_WAITALLを使用できます。 UDPおよびその他のデータグラムプロトコルで
http://pubs.opengroup.org/onlinepubs/007904975/functions/recv.html
あなたが望むように、パケットの境界は保持されます。 TCPおよび他のストリームプロトコルの場合、そのような運はありません。
私の言いたいことは、(例えば)バッファ "\ 0秒bu"を受け取るということですか? –
答えが「はい」の場合、どのようにして「パケット」を別のものから区別できますか?何らかの種類の終了シーケンスを使用すべきですか? –
はい、あなたもそれを受け取ることができます。あなたはあなたの 'パケット'を区別するためにデータに何かを持っている必要があります。 「パケット」の長さやデリミタの種類(データには表示されません)を送信することができます。 –