![](/img/trans.png)
[英]C# - How to know how many bytes are left in TcpClient after perform SslStream.Read
[英]SslStream read all bytes
当我尝试从 SslStream 读取时,如果我没有设置连接超时,Read() 永远不会结束,但是如果我设置了,我会遇到超时异常。 这家伙有同样的问题http://msdn.microsoft.com/en-us/library/system.net.security.sslstream.read.aspx 。 我不知道在这里做什么代码
public byte[] ReadBytes()
{
this.bufferGlobal.Clear();
byte[] buffer = new byte[this.bufferSize];
int recv = this.stream.Read(buffer, 0, buffer.Length);
while (recv != 0)
{
addBytes(buffer, ref bufferGlobal, recv);
recv = this.stream.Read(buffer, 0, buffer.Length);
}
return (byte[])this.bufferGlobal.ToArray(typeof(byte));
}
提前谢谢。
更新:
我想我找到了答案。 我可以将 SslStream 上的读取超时设置为等于 1,该值对于套接字活动没有意义(这意味着您可以下载大文件并且不用担心 SslStream 他不会关闭连接或中断接收数据)。 我只是测试这个解决方案,但似乎工作正常。 谢谢大家。
您正在从网络流中读取数据,这意味着在另一端关闭其一半的连接之前,您不会遇到流的结尾。 仅仅停止发送数据是不够的。 因此,让您的其他程序在发送了它想要发送的所有数据后关闭连接。
在连接关闭之前,流不会结束。 这是所有长度未知的流的性质。
您要么需要提前知道长度,要么需要继续阅读直到连接关闭。 一种常见的方法是将流的字节长度作为 64 位 int 传输。 所以你的流的前 8 个字节被读入一个 int64,然后剩下的就是数据。
通常,人们一次读取一个“缓冲区”。
伪代码
while(!Stream.end) { i = Stream.Read(buffer, buffer.length) DestStream.Write(buffer, i) }
有点晚了,但我正在使用 msdn 代码并进行以下修改
if (sb.ToString().IndexOf("a OK") != -1 || sb.ToString().IndexOf("a BAD") != -1 || sb.ToString().IndexOf("a NO") != -1)
{
break;
}
如果它适合您,请使用此工作补丁:
int bytesRead = 0;
string chunkString = "";
do
{
byte[] responseBuffer = new byte[CHUNKSIZE];
bytesRead = sslStream.Read(responseBuffer, 0, responseBuffer.Length);
ApplicationHelper.ApplicationLogger.WriteInfoLog("Bytes Received " + bytesRead);
if (bytesRead > 0)
{
chunkString = Encoding.UTF8.GetString(responseBuffer, 0, bytesRead);
responseXML += chunkString;
}
}
while (!chunkString.EndsWith(EOF));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.