private void StartServerSocket()

in rd-net/RdFramework/Impl/SocketWire.cs [657:717]


      private void StartServerSocket(Lifetime lifetime, Socket serverSocket)
      {
        if (serverSocket == null) throw new ArgumentNullException(nameof(serverSocket));
        Port = ((IPEndPoint) serverSocket.LocalEndPoint).Port;
        Log.Verbose("{0} : started, port: {1}", Id, Port);

        var thread = new Thread(() =>
        {
          Log.Catch(() =>
          {
            while (lifetime.IsAlive)
            {
              try
              {
                Log.Verbose("{0} : accepting, port: {1}", Id, Port);
                var s = serverSocket.Accept();
                lock (Lock)
                {
                  if (!lifetime.IsAlive)
                  {
                    Log.Verbose("{0} : connected, but lifetime is already canceled, closing socket", Id);
                    CloseSocket(s);
                    return;
                  }
                  else
                  {
                    Log.Verbose("{0} : accepted", Id);
                    if (!AcceptHandshake(s))
                      continue;
                    Socket = s;
                    Log.Verbose("{0} : connected", Id);
                  }
                }

                SocketProvider.Value = s;
              }
              catch (SocketException e)
              {
                var errcode = e.SocketErrorCode;
                if (errcode == SocketError.TimedOut || errcode == SocketError.WouldBlock) continue; //expected, Linux

                Log.Verbose("{0}: SocketException with message {1}", Id, e.Message);
              }
              catch (ObjectDisposedException e)
              {
                Log.Verbose("{0}: ObjectDisposedException with message {1}", Id, e.Message);
              }
              catch (Exception e)
              {
                Log.Error(e, Id);
              }
            }
          });

          Log.Verbose("{0}: terminated.", Id);
        }) {Name = Id + "-Receiver", IsBackground = true};

        thread.Start();

        AddTerminationActions(thread);
      }