private void ReceiverProc()

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();
      }