Tim*_*Tim 4 c# tcp networkstream ioexception
我正在使用NetworkStream来保持可以发送消息的开放TCP/IP连接.我收到一条消息,处理它,然后返回一个ACK.我正在使用一个偶尔收到消息的站点,但是当我发送ACK时,我得到一个IOException.有时这只持续一两条消息(我可以接收下一条消息),有时它会一直持续到服务停止并重新启动.
下面是我的NetworkStream的代码,没有任何处理:
using (NetworkStream stream = client.GetStream())
{
stream.ReadTimeout = ReadTimeout;
...
if (stream.CanRead && stream.DataAvailable)
bytesRead = stream.Read(receivedBytes, 0, BufferSize);
...
stream.Write(ack, 0, ack.Length);
}
Run Code Online (Sandbox Code Playgroud)
请注意,代码在读取新消息和发送ACK之间循环.
当我打电话时stream.Write
,我有时会得到以下异常:
System.IO.IOException: Unable to write data to the transport connection: An established connection was aborted by the software in your host machine. ---> System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine
at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at Framework.Communication.Model.Server.AcceptMessage(IAsyncResult ar)
Run Code Online (Sandbox Code Playgroud)
我查看了这条消息,并为几种不同的通信方法找到了几个来源.听起来这是一个非常通用的例外,并不能真正说明发生了什么.
有谁知道会导致这种情况,或者我可以开始寻求缩小解决方案的范围?
你认为这是一个普遍的问题是正确的,所以你必须更加防守.
要考虑的事情
SocketException
问题.在第三种情况下,远程方不再连接(例如通过拔出网络电缆)而没有双方之间的任何通信.
注意:这些都没有解释部分问题的间歇性(如果我正确阅读)
所以让我们看一下文档说的内容
NetworkStream.Write方法(Byte [],Int32,Int32)
IOException异常
- 写入网络时出现故障.
- 访问套接字时发生错误.有关详细信息,请参阅"备注"部分.
备注
如果收到a
SocketException
,请使用该SocketException.ErrorCode
属性获取特定的错误代码,并参阅MSDN中的Windows Sockets版本2 API错误代码文档以获取错误的详细说明.
所以在我看来,如前所述,你需要更加防守.
检查0个字节.
检查错误.
在其中任何一种情况下,重新启动连接,记录故障并假设连接已关闭(或异常关闭)可能是良好的做法(并且有意义)
其他资源
****检测半开(掉落)连接****Stephen Cleary
归档时间: |
|
查看次数: |
4758 次 |
最近记录: |