The MSDN documentation seems to suggest that NetworkStream.Read will always return immediately. If no data is found, it returns 0. However, I have some code that is currently deployed, which only in some cases (and I haven't figured out which ones yet), NetworkStream.Read seems to freeze. Here is the stack trace I was able to collect from the dump file
00000000705ae850 000007fef784f60d DomainBoundILStubClass.IL_STUB (IntPtr, Byte *, Int32, System.Net.Sockets.SocketFlags)
00000000705ae930 000007fef785c930 System.Net.Sockets.Socket.Receive (Byte [], Int32, Int32, System.Net.Sockets.SocketFlags, System.Net.Sockets.SocketError ByRef)
00000000705ae9b0 000007ff004eb668 System.Net.Sockets.NetworkStream.Read (Byte [], Int32, Int32)
00000000705aea40 000007fef784e6ae MySocketStuff.SocketConnectCallback (System.IAsyncResult)
00000000705aeb20 000007fef84f2bbb System.Net.LazyAsyncResult.Complete (IntPtr)
00000000705aeb90 000007fef7853c7b System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
00000000705aebe0 000007fef784e5d3 System.Net.ContextAwareResult.Complete (IntPtr)
00000000705aec40 000007fef7d027f9 System.Net.LazyAsyncResult.ProtectedInvokeCallback (System.Object, IntPtr)
00000000705aeca0 000007fef8b9815e System.Net.Sockets.Socket.ConnectCallback ()
00000000705aed20 000007fef93e14c2 System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback (System.Object, Boolean)
I notice that NetworkStrea.Read actually calls Socket.Receive, which can be blocked, as I understand it. I just don’t know why sometimes it is blocked, and sometimes not.
c # sockets blocking networkstream
Mark
source share