0

助けが必要です。C# TCPClient を使用した単純なサーバー クライアント アプリケーションがあります。

私が抱えている問題は、クライアントがサーバーにメッセージを送信すると、サーバーが数字を含む 4 バイトの応答を返すことです。

しかし、3 つまたは 4 つの応答ごとに、バイトは同じ間違った場所にあります。

例えば:

整数 243 を含むバイト配列を含むサーバー応答:

byte[0] => 243 byte[1] => 0 byte[2] => 0 byte[3] => 0

クライアントは次のように 4 バイトを受け取ります。

byte[0] => 0 byte[1] => 0 byte[2] => 243 byte[3] => 0

これは 243 ではなく 15925248 の整数です。

サーバー コードのスニペットを次に示します。クライアントがメッセージを送信すると、コードが実行されます。

byte[4] resp = new byte[4];
Buffer.BlockCopy(BitConverter.GetBytes(243), 0, resp, 0, 4);
clientStream.Write(resp, 0, resp.Length);
clientStream.Flush();

受信するクライアント コードのスニペットは次のとおりです。

Byte[] rec = new Byte[4] {0xx0, 0x00, 0x00, 0x00};
if (netStream.CanRead)
{
int numberOfBytesRead = 0;
do
{
numberOfBytesRead = netStream.Read(rec, 0, rec.Length);
} while (netStream.DataAvailable);
}

私は次のことを行いました: - サーバーが実際にバイト配列を正しく送信していることを確認しました。

ここで何が間違っているのかわかりません。または、私のコードにバグがあるかどうか。

4

1 に答える 1

1

を取得しますnumberOfBytesReadが、実際に 4 バイトすべてを受信したかどうかは確認しません。たとえば、最初に受信したデータが 3 バイトの場合、次のバイトはReadストリームから連続して読み取られ、データが「シフト」されます。

コードを次のように変更することで、これを修正できます。

byte[] rec = new byte[4];
int index = 0;
int remainingBytes = rec.Length;
while (remainingBytes > 0)
{
    int read = netStream.Read(rec, index, remainingBytes);
    if (read == 0) return DisconnectedBeforeReceiving4Bytes();
    remainingBytes -= read;
    index += read;
}
于 2013-09-16T07:37:06.907 に答える