NetworkStream.Read()和SSL

时间:2012-07-31 07:43:03

标签: c# networkstream

只是想知道是否有人可以查看以下代码并向我解释为什么length变量返回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是一个字符串,在任何人问之前)

1 个答案:

答案 0 :(得分: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