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