1

誰かが次のコードを見て、長さ変数が0を返す理由を私に説明できるかどうか疑問に思っていました:

textToBeEncrypted = Encoding.ASCII.GetString(buffer);
txtEncryptedText = AESEncryption(textToBeEncrypted, key, true);
byte[] encText = Encoding.ASCII.GetBytes(txtEncryptedText);

NetworkStream stream = s.GetStream();
stream.Write(encText, 0, PACKET_SIZE);

s.ReceiveTimeout = Timeout;

int length = stream.Read(buffer, 0, PACKET_SIZE);
if (length == PACKET_SIZE)
{
    string decText = Encoding.ASCII.GetString(encText);
    txtDecryptedText = AESDecryption(decText, key, true);
    buffer = Encoding.ASCII.GetBytes(txtDecryptedText);
    retval = Decode();
}            

AESを使用してすべてをエンコードした後、1366バイトのデータをencTextに書き出しています(PACKET_SIZEは1036です)。Sendに関する苦情はありません。データは楽しく送信されます。ただし、読み戻そうとすると、長さは常に0になります。つまり、デコードステートメントのブラケットを入力できません。何か案は?(retvalは文字列であり、誰もが尋ねる前に)

4

1 に答える 1

2

lengthこれからゼロの場合:

int length = stream.Read(buffer, 0, PACKET_SIZE);

これは、他のマシンがアウトバウンドソケット(インバウンドソケット)を閉じており、これ以上データが利用できないことを意味します。

また、これについては非常に注意する必要があります。

if (length == PACKET_SIZE)
{...}

あなたが読んだものについての保証は絶対にありません。ここで行うべきことは、メッセージ全体(フレーム)が得られるまでデータをバッファリングしてから、バッファリングしたものを処理することです。特に、もう一方の端がバイト未満を送信する場合、PACKET_SIZEコードは何もしないことが保証されます。もう一方の端が正確に バイトを送信したとしても、正確に1つのバイトチャンクでPACKET_SIZE到着する可能性はほとんどありません。PACKET_SIZE

例えば:

int length;
MemoryStream ms = new MemoryStream();
while((length = stream.Read(buffer, 0, buffer.Length)) > 0) {
    ms.Write(buffer, 0, length); // append what we just recieved

    // now: could check `ms` to see if we have a "frame" here...
}
//...or you could just process the entire recieved data here
于 2012-07-31T07:50:39.353 に答える