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