Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NetworkStream.Read()和SSL_C#_Networkstream - Fatal编程技术网

C# NetworkStream.Read()和SSL

C# NetworkStream.Read()和SSL,c#,networkstream,C#,Networkstream,我只是想知道是否有人可以看看下面的代码并向我解释为什么长度变量返回0: textToBeEncrypted = Encoding.ASCII.GetString(buffer); txtEncryptedText = AESEncryption(textToBeEncrypted, key, true); byte[] encText = Encoding.ASCII.GetBytes(txtEncryptedText); NetworkStream stream = s.GetStream(

我只是想知道是否有人可以看看下面的代码并向我解释为什么长度变量返回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(数据包大小为1036)写出1366字节的数据。我没有收到关于发送的投诉;数据被愉快地发送出去。然而,当它试图读回它时,长度始终为0,这意味着我无法输入decode语句括号。有什么想法吗?(在任何人询问之前,retval是一个字符串)

如果
长度从此处为零:

int length = stream.Read(buffer, 0, PACKET_SIZE);
这意味着另一台计算机已关闭其出站套接字(您的入站套接字),并且不再有可用的数据

您还应该非常小心:

if (length == PACKET_SIZE)
{...}
你所读的内容绝对不能保证。这里应该做的是缓冲数据,直到有一个完整的消息(帧),然后处理缓冲的内容。特别是,如果另一端发送小于
数据包大小
字节的数据,则您的代码将保证不执行任何操作。即使另一端发送的数据包大小正好是
PACKET\u SIZE
字节,它也不太可能准确地到达一个
PACKET\u 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

干杯,马克。除了使用长度>0外,了解传入数据有多大最简单的方法是什么?@Skulmuk?你绝对不能仅仅从一个流就知道这一点,这就是为什么许多协议采取务实的方法,用下一条消息的大小来预先处理每条消息,通常是网络字节顺序int-32;首先读取4字节的报头,它告诉您实际消息需要缓冲多少;处理信息;冲洗重复一遍。另一种在文本协议中常见的方法是使用CR/LF/CRLF作为帧标记。谢谢,@Marc。我仍在返回0字节,但我有一种感觉,目前网络上正在发生一些事情。谢谢你的帮助;)@Skulmuk firewall是第一个要检查的东西。我想问的是,我正在写入的缓冲区比PACKET_SIZE变量大这一事实是否有任何区别(这就是阻止我的发送方法崩溃的原因)?干杯