7

サーバークライアントモデルを使用してC#でアプリケーションを開発しています。このモデルでは、サーバーがビット配列を含むバイト配列をクライアントに送信し、クライアントがそれを画面にロードし、サーバーに「OK」を送信し、サーバーが送信します。別の画像など。

画像バッファの長さは異なります。通常は60kbから90kbの間ですが、問題ではないことを確認しました。localhostを使用して、クライアントとサーバーを同じコンピューターに配置すると、すべてが正常に機能します。サーバーはbeginSendを実行し、クライアントはendReceiveを実行し、バッファー全体が送信されます。

しかし、私は現在ワイヤレスネットワークでこれをテストしており、何が起こるかは次のとおりです。

  • サーバーは画像を送信します。
  • クライアントでコールバック関数data_receivedが呼び出されますが、読み取るのは1460バイトだけです(MTU-なぜ?UDPだけにすべきではないのですか?)
  • クライアントでコールバック関数data_receivedが再度呼び出され、残りのバッファー(1000バイトまたは100キロバイト)が使用されます...

これは常にこのように、1460バイトの最初のパケットが受信され、次に2番目のパケットに残りが含まれます。

受信した両方のバイト配列を結合することでこれを回避できますが、これは正しくないようです。なぜこれが起こっているのかさえわかりません。ネットワークに制限はありますか?では、なぜC#はデータ全体が送信されるのを待たないのでしょうか。つまり、TCPです。心配する必要はありませんよね?

とにかく、どんな助けも素晴らしいでしょう!
乾杯

4

3 に答える 3

14

これはTCPです。データをストリームとして扱う必要があります。ストリームがどのようにパケットに分割されるかを気にしたり、それについて推測したりする必要はありません。

データの単一の「ブロック」を受信する必要がある場合、それを確実に行う最も簡単な方法は、データの前に長さを付けることです(たとえば、32ビット値として)。長さを読み取り(それらのバイトも複数のパケットに分割される可能性があることに注意してください)、すべてのデータを読み取るまで、毎回読み取った量に注意して(同期または非同期にかかわらず)繰り返し読み取ります。

于 2009-04-20T16:32:46.103 に答える
5

9.2.4を読んでください

アプリケーション層プロトコルを分析する場合、各TCPパケットにアプリケーション層メッセージが1つだけ含まれているとは限りません。1つのアプリケーション層メッセージを複数のTCPパケットに分割できます。

于 2009-04-20T16:33:18.317 に答える
0

ジョンの答えに追加する:

int offset = 0;
int imagesize = 512;
byte[] buffer = new byte[512];

tcpChannel.Read(buffer, offset, imagesize);
于 2009-06-06T22:21:46.980 に答える