Я сериализую объекты из Stream
с BinaryReader
:
class MyClass
{
public void Read(Stream stream)
{
BinaryReader reader = new Reader(stream);
this.someField = reader.ReadSomething(); // IOException
}
}
Проблема в одном случае заключается в том, что если я читаю из NetworkStream
, сервер закрывает соединение сразу послеотправка данных.Это приводит к IOException
(«Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом.») даже до того, как я прочитал все содержимоена моей стороне.Как я могу прочитать эти данные?Разве это не буферизовано где-то?
Протокол, который я читаю, TLS , и упомянутая ситуация возникает, если сервер отправляет фатальное предупреждение, и я хочу прочитать это предупреждение, после чего соединение должно быть немедленно закрытос обеих сторон.
Сообщение об исключении:
System.IO.IOException
Message=Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
Source=System
StackTrace:
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.IO.Stream.ReadByte()
at System.IO.BinaryReader.ReadByte()
at MyClass.Read(Stream stream)
[...]
InnerException: System.Net.Sockets.SocketException
Message=An existing connection was forcibly closed by the remote host
Source=System
ErrorCode=10054
NativeErrorCode=10054
StackTrace:
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
class Record
{
public void Read(Stream stream)
{
BinaryReader reader = new BinaryReader(stream);
byte contentType = reader.ReadByte();
byte majorVer = reader.ReadByte();
byte minorVer = reader.ReadByte();
ushort payloadSize = reader.ReadUInt16();
if(contentType == 21) // Alert
{
Alert alert = new Alert();
alert.Read(stream);
}
}
}
class Alert
{
public void Read(Stream stream)
{
BinaryReader reader = new BinaryReader(stream);
byte level = reader.ReadByte(); // IOException
byte desc = reader.ReadByte();
}
}