1

私はネットワーキングプロジェクトに取り組んでいます。クライアントからサーバー リスナーにデータを送信する場合、リスナーはこのデータを 2 つ以上のコールバック (TCP ブロッキング) で処理できますか? つまり、「Hello World」を送信しました。サーバー リスナー (TCP ブロッキング) は、1"Hello" 2"World" または 1"Hell" 2"o World" などの受信を処理できますか? これが可能であれば、TCP データ パケット用のパケット ハンドラを作成します。ありがとう!

編集: (詳細説明) 、これは可能性がありますか (TCP ブロッキング)?

  • クライアントは「Hello world」と言います
  • サーバーは、最初のコールバック「recv();」で「Hello」を読み取ります。( recv();関数は "Hello" 出力を返します)
  • サーバーは、2 番目のコールバック「recv();」で「world」を読み取ります。( recv();関数は「世界」の出力を与える)
4

2 に答える 2

1

はい、これは絶対に可能です。この特定のケースでは、ほとんどありませんが、パケットが 12 バイトよりも少し大きい場合 (数百バイトまたは数千バイトなど)、ローカル ネットワークよりも離れた場所に送信すると、ほぼ確実に分割されます。

逆の問題も発生する可能性があることに注意してください。送信側は2つの個別の「パケット」を送信し、受信側はデータの塊を1つしか受信しません。TCP はストリーム プロトコルであり、パケット プロトコルではないことに注意してください。パケットは、基礎となるプロトコル スタックの一部としてのみ存在し、ネットワークが適切と判断したときに分割およびマージできます。保証されるのは、受け取るデータが正しい順序であり、データの塊のチェックサムが正しいことだけです。

于 2013-07-29T15:13:14.160 に答える
0

データの各部分の長さが正確にわかっている場合 (たとえば、"Hello" は 5 文字の長さ)、最初のコールバックで読み取りをブロックし、次に (recv() を個別に呼び出して) 読み取りをブロックできます。

または、これらの部分がどのように分離されるかがわかっている場合 (あなたの場合はスペース)、最初のコールバックで recv() を 1 バイトずつ実行し、セパレータを受け取ったら、2 番目のコールバックで受信するように切り替えます。

または、特別なプロトコルを使用してそれらを区別することもできます (ある場合)。

それでも、これらのパッケージをどのレイヤーで個別に解釈したいのかわかりません。

于 2013-08-04T20:18:45.633 に答える