C# - 如何知道执行 SslStream.Read 后 TcpClient 中还剩下多少字节
C# - How to know how many bytes are left in TcpClient after perform SslStream.Read
我正在做一个客户端-服务器应用程序,服务器将检查何时有可用数据 (TcpClient.Available > 0) 可读取,但当它 运行s SslStream.Read ,即使我知道我需要读取多少字节,它仍然将 TcpClient.Available 设置回 0 并保留已读取的字节......我的代码未读取,因为条件 (TcpClient.Available > 0)将是错误的,这样服务器就不会对额外的字节做任何事情,直到客户端发送更多的字节,这是不希望的,服务器应该尽快处理客户端发送的所有字节。
这是一些代码:
static void main()
{
TcpClient tcpClient = listener.AcceptTcpClient();
SslStream s = new SslStream(tcpClient.GetStream(), false);
//authenticate etc ...
while (true)
{
if (tcpClient.Available > 0) // now this condition is false until
// the client send more bytes
// which is not wanted
work(tcpClient);
}
}
static void work(TcpClient c)
{
//client sent 50 bytes
byte[] data = new byte[10];
s.Read(data, 0, 10); // I know this is not guaranteed to read 10 bytes
//so I have a while loop to read until it receives all the byes, this line is just for example
// do something with the 10 bytes I read, back to the while loop
}
我的 "work" 实际上创建了一个新线程来完成工作并锁定该客户端直到工作完成,以便该客户端在工作完成之前不会调用工作
因为我知道从 "work" 到 运行 需要多少字节,所以我只读取那个字节数并解锁客户端,以便客户端可以再次 "work"
当然还有其他客户端也需要工作,这里我只展示一个来演示问题
您通常不知道还 有多少字节要从流中读取。
但是您可以“在读取时”从流中读取,因为 SslStream.Read returns 读取的字节数!
所以你的代码变简单了
while (s.Read(data, 0, 10) > 0)
{
// do something with the bytes you've read
}
这是人们使用流的一般方式 - 在读取时按块读取它们。
您可以在我之前链接的文档中的示例中看到它(还有更多!您应该明确地检查它)
我正在做一个客户端-服务器应用程序,服务器将检查何时有可用数据 (TcpClient.Available > 0) 可读取,但当它 运行s SslStream.Read ,即使我知道我需要读取多少字节,它仍然将 TcpClient.Available 设置回 0 并保留已读取的字节......我的代码未读取,因为条件 (TcpClient.Available > 0)将是错误的,这样服务器就不会对额外的字节做任何事情,直到客户端发送更多的字节,这是不希望的,服务器应该尽快处理客户端发送的所有字节。 这是一些代码:
static void main()
{
TcpClient tcpClient = listener.AcceptTcpClient();
SslStream s = new SslStream(tcpClient.GetStream(), false);
//authenticate etc ...
while (true)
{
if (tcpClient.Available > 0) // now this condition is false until
// the client send more bytes
// which is not wanted
work(tcpClient);
}
}
static void work(TcpClient c)
{
//client sent 50 bytes
byte[] data = new byte[10];
s.Read(data, 0, 10); // I know this is not guaranteed to read 10 bytes
//so I have a while loop to read until it receives all the byes, this line is just for example
// do something with the 10 bytes I read, back to the while loop
}
我的 "work" 实际上创建了一个新线程来完成工作并锁定该客户端直到工作完成,以便该客户端在工作完成之前不会调用工作
因为我知道从 "work" 到 运行 需要多少字节,所以我只读取那个字节数并解锁客户端,以便客户端可以再次 "work"
当然还有其他客户端也需要工作,这里我只展示一个来演示问题
您通常不知道还 有多少字节要从流中读取。
但是您可以“在读取时”从流中读取,因为 SslStream.Read returns 读取的字节数!
所以你的代码变简单了
while (s.Read(data, 0, 10) > 0)
{
// do something with the bytes you've read
}
这是人们使用流的一般方式 - 在读取时按块读取它们。
您可以在我之前链接的文档中的示例中看到它(还有更多!您应该明确地检查它)