Socket的处理状态

时间:2015-09-03 06:14:56

标签: c# sockets dispose

我正在审核一些使用Socket类的代码,特别是属性Available,以检查是否已收到数据并准备好阅读。

在程序运行期间,有时在访问属性ObjectDisposedException时会抛出Available

我现在的问题是,在访问属性Connected之前向Available属性添加检查是否足以避免异常。类Socket不提供IsDisposed等属性。

这样的东西
if (socket.Connected && socket.Available)

其他问题是Socket何时转换到此Disposed状态?只有当我在Socket实例上显式调用CloseDispose时才有可能在读取/写入套接字时发生SocketException时达到状态。首先看程序代码似乎能很好地处理套接字的生命周期。

1 个答案:

答案 0 :(得分:0)

如果您在Socket.Connected上查找http://referencesource.microsoft.com/ 您将看到Connected的属性在第569行执行对Poll(..)的调用时将抛出ObjectDisposedException。 但是还有一个内部状态“m_NonBlockingConnectInProgress”必须是真的。

当您调用Socket.Connect(...)并且Socket.Blocking为false时,

“m_NonBlockingConnectInProgress”为true。

如果属性CleanedUp为true,那么

Socket.Available将抛出一个ObjectDisposedException,当Socket被释放时,它看起来像属性CleanedUp为真