是否可以在已抛出IOException的套接字上访问读缓冲区?

时间:2013-11-22 20:39:38

标签: c# .net sockets tcp tcpclient

我有一个应用程序,它使用异步BeginWrite方法在TcpClient类中发送大量数据。为了节省读取周期并尽可能快地发送我的有效负载,在完成所有发送之前,我不会从ReceiveBuffer中读取任何内容。我已经将ReceiveBuffer设置为足够大的大小,以便它可以捕获所有响应。

问题是有时连接在发送期间被重置/关闭(System.IO.IOException:无法写入数据到传输连接:已建立的连接被主机中的软件中止机)。我通过创建一个新的TcpClient,重新建立连接并继续发送来从中恢复。但是我以前用来发送的套接字现在已经关闭,我无法读取到目前为止收到的缓冲区。有没有办法恢复该套接字的ReceiveBuffer中的数据?

更多信息:
我正在从TcpClient提供的底层NetworkStream创建一个SslStream,并通过它发送数据。有时,服务器的响应包含HTTP标头中的Connection:close。而且我猜SslStream会自行关闭并最终关闭Socket。由于我在发送周期中通常不会读取响应,因此我不知道收到Connection:close。发生这种情况后,下一次写入SslStream的尝试似乎无声地失败,因为没有异常,但也没有从服务器收到任何响应。下一次尝试写入SslStream会导致IOException。

我已经尝试检查套接字的状态,并以各种方式流式传输,例如Socket.Connected,Socket.Poll(1000,SelectMode.SelectWrite),SslStream.CanWrite。所有这些都会一直返回True,包括在写入尝试时抛出IOException之前。

0 个答案:

没有答案