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 对所有内容进行编码后,我在 encText 中写出 1366 字节的数据(PACKET_SIZE 为 1036)。我没有收到关于发送的任何投诉;数据愉快地发送出去。但是,当它尝试将其读回时,长度始终为 0,这意味着我无法输入解码语句括号。有任何想法吗?(在有人问之前,retval 是一个字符串)

4

1 回答 1

2

如果这length是零:

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

这意味着另一台机器已经关闭了他们的出站套接字(你的入站套接字),并且不再有数据可用。

您还应该非常小心:

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

绝对不能保证您阅读的内容。你应该在这里做的是缓冲数据,直到你有一个完整的消息(帧),然后处理你缓冲的内容。特别是,如果另一端发送的字节数少于PACKET_SIZE字节,则保证您的代码什么也不做。即使另一端准确地 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 回答