internal void SetSocketTimeoutOption(SocketShutdown mode, int timeout, bool silent)
{
if (NetEventSource.IsEnabled) NetEventSource.Enter(this, mode, timeout, silent);
DebugThreadTracking.ThreadContract(ThreadKinds.Unknown, $"NetworkStream#{NetEventSource.IdOf(this)}");
if (timeout < 0)
{
timeout = 0; // -1 becomes 0 for the winsock stack
}
Socket chkStreamSocket = _streamSocket;
if (chkStreamSocket == null)
{
return;
}
if (mode == SocketShutdown.Send || mode == SocketShutdown.Both)
{
if (timeout != _currentWriteTimeout)
{
chkStreamSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, timeout, silent);
_currentWriteTimeout = timeout;
}
}
if (mode == SocketShutdown.Receive || mode == SocketShutdown.Both)
{
if (timeout != _currentReadTimeout)
{
chkStreamSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, timeout, silent);
_currentReadTimeout = timeout;
}
}
}