in rd-net/RdFramework/Impl/SocketWire.cs [154:208]
private void ReceiverProc(Socket socket)
{
myPkg = new BufferWindow(16384);
myPkgBuffer = new BufferWindow(16384);
mySocketBuffer = new BufferWindow(16384);
myMsgLengthBuffer = new BufferWindow(4);
myPkgHeaderBuffer = new BufferWindow(12);
while (myLifetime.IsAlive)
{
if (!socket.Connected)
{
Log.Verbose("Stop receive messages because socket disconnected");
break;
}
try
{
if (!ReadMsg())
{
Log.Verbose("{0} Connection was gracefully shutdown", Id);
break;
}
}
catch (Exception e)
{
if (e is SocketException socketEx)
{
var errcode = socketEx.SocketErrorCode;
if (errcode == SocketError.TimedOut || errcode == SocketError.WouldBlock) continue; //expected
}
if (e is SocketException || e is ObjectDisposedException)
{
Log.Verbose("Exception in SocketWire.Receive: {0} {1} {2}", e.GetType().Name, Id, e.Message);
//That's why we don't use Timeout any more. Exception happens only on windows but blocks socket completely.
if (e.Message.ToLower().Contains("Overlapped I/O Operation is in progress".ToLower()))
{
Log.Error(
"ERROR! Socket {0} {1} is in invalid state. Probably no more messages will be received. Exception message: '{2}'. " +
"Sometimes it happens because of Timeout property on socket. Your os: {3}.",
e.GetType().Name, Id, e.Message, Environment.OSVersion.VersionString);
}
}
else
{
Log.Error(e);
}
break;
}
}
LogTraffic();
}