NetworkStream.Read() and SSL



我只是想知道是否有人可以查看以下代码并向我解释为什么长度变量返回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,这意味着我无法进入decode语句括号。有什么想法吗?(retval是一个字符串,在任何人询问之前)

如果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

最新更新