Socket.LingerState Eigenschaft

Definition

Ruft einen Wert ab, der angibt, ob der Socket bei einem Versuch, alle ausstehenden Daten zu senden, das Schließen eines Sockets verzögert, oder legt diesen fest.

public:
 property System::Net::Sockets::LingerOption ^ LingerState { System::Net::Sockets::LingerOption ^ get(); void set(System::Net::Sockets::LingerOption ^ value); };
public System.Net.Sockets.LingerOption? LingerState { get; set; }
public System.Net.Sockets.LingerOption LingerState { get; set; }
member this.LingerState : System.Net.Sockets.LingerOption with get, set
Public Property LingerState As LingerOption

Eigenschaftswert

Eine LingerOption, die angibt, wie der Nachlauf während des Schließens eines Sockets erfolgen soll.

Ausnahmen

Fehler beim Versuch, auf den Socket zuzugreifen.

Der Socket wurde geschlossen.

Beispiele

Im folgenden Codebeispiel wird die Verwendung des LingerState-Attributs veranschaulicht.

static void ConfigureTcpSocket(Socket^ tcpSocket)
{
     
    // Don't allow another socket to bind to this port.
    tcpSocket->ExclusiveAddressUse = true;
     
    // The socket will linger for 10 seconds after
    // Socket.Close is called.
    tcpSocket->LingerState = gcnew LingerOption(true, 10);
     
    // Disable the Nagle Algorithm for this tcp socket.
    tcpSocket->NoDelay = true;
     
    // Set the receive buffer size to 8k
    tcpSocket->ReceiveBufferSize = 8192;
     
    // Set the timeout for synchronous receive methods to
    // 1 second (1000 milliseconds.)
    tcpSocket->ReceiveTimeout = 1000;
     
    // Set the send buffer size to 8k.
    tcpSocket->SendBufferSize = 8192;
     
    // Set the timeout for synchronous send methods
    // to 1 second (1000 milliseconds.)
    tcpSocket->SendTimeout = 1000;
     
    // Set the Time To Live (TTL) to 42 router hops.
    tcpSocket->Ttl = 42;
    Console::WriteLine("Tcp Socket configured:");
    Console::WriteLine("  ExclusiveAddressUse {0}", 
        tcpSocket->ExclusiveAddressUse);
    Console::WriteLine("  LingerState {0}, {1}", 
        tcpSocket->LingerState->Enabled,
        tcpSocket->LingerState->LingerTime);
    Console::WriteLine("  NoDelay {0}",
        tcpSocket->NoDelay);
    Console::WriteLine("  ReceiveBufferSize {0}", 
        tcpSocket->ReceiveBufferSize);
    Console::WriteLine("  ReceiveTimeout {0}",
        tcpSocket->ReceiveTimeout);
    Console::WriteLine("  SendBufferSize {0}",
        tcpSocket->SendBufferSize);
    Console::WriteLine("  SendTimeout {0}",
        tcpSocket->SendTimeout);
    Console::WriteLine("  Ttl {0}",
        tcpSocket->Ttl);
    Console::WriteLine("  IsBound {0}",
        tcpSocket->IsBound);
    Console::WriteLine("");
}
static void ConfigureTcpSocket(Socket tcpSocket)
{
    // Don't allow another socket to bind to this port.
    tcpSocket.ExclusiveAddressUse = true;

    // The socket will linger for 10 seconds after
    // Socket.Close is called.
    tcpSocket.LingerState = new LingerOption (true, 10);

    // Disable the Nagle Algorithm for this tcp socket.
    tcpSocket.NoDelay = true;

    // Set the receive buffer size to 8k
    tcpSocket.ReceiveBufferSize = 8192;

    // Set the timeout for synchronous receive methods to
    // 1 second (1000 milliseconds.)
    tcpSocket.ReceiveTimeout = 1000;

    // Set the send buffer size to 8k.
    tcpSocket.SendBufferSize = 8192;

    // Set the timeout for synchronous send methods
    // to 1 second (1000 milliseconds.)
    tcpSocket.SendTimeout = 1000;

    // Set the Time To Live (TTL) to 42 router hops.
    tcpSocket.Ttl = 42;

    Console.WriteLine("Tcp Socket configured:");

    Console.WriteLine($"  ExclusiveAddressUse {tcpSocket.ExclusiveAddressUse}");

    Console.WriteLine($"  LingerState {tcpSocket.LingerState.Enabled}, {tcpSocket.LingerState.LingerTime}");

    Console.WriteLine($"  NoDelay {tcpSocket.NoDelay}");

    Console.WriteLine($"  ReceiveBufferSize {tcpSocket.ReceiveBufferSize}");

    Console.WriteLine($"  ReceiveTimeout {tcpSocket.ReceiveTimeout}");

    Console.WriteLine($"  SendBufferSize {tcpSocket.SendBufferSize}");

    Console.WriteLine($"  SendTimeout {tcpSocket.SendTimeout}");

    Console.WriteLine($"  Ttl {tcpSocket.Ttl}");

    Console.WriteLine($"  IsBound {tcpSocket.IsBound}");

    Console.WriteLine("");
}

Hinweise

Die LingerState -Eigenschaft ändert das Verhalten der Close Methode. Diese Eigenschaft ändert beim Festlegen die Bedingungen, unter denen die Verbindung von Winsock zurückgesetzt werden kann. Verbindungsrücksetzungen können weiterhin basierend auf dem IP-Protokollverhalten erfolgen.

Diese Eigenschaft steuert, wie lange eine verbindungsorientierte Verbindung nach einem Aufruf von Close geöffnet bleibt, wann Daten gesendet werden sollen.

Wenn Sie Methoden aufrufen, um Daten an einen Peer zu senden, werden diese Daten im ausgehenden Netzwerkpuffer platziert. Diese Eigenschaft kann verwendet werden, um sicherzustellen, dass diese Daten an den Remotehost gesendet werden, bevor die Close -Methode die Verbindung abbricht.

Um das Verweilen zu aktivieren, erstellen Sie eine LingerOption Instanz mit den gewünschten Werten, und legen Sie die LingerState -Eigenschaft auf diese Instanz fest.

In der folgenden Tabelle wird das Verhalten der Close -Methode für die möglichen Werte der Enabled -Eigenschaft und der in der LingerTimeLingerState -Eigenschaft gespeicherten Eigenschaft beschrieben.

LingerState.Enabled LingerState.LingerTime Verhalten
false (deaktiviert), der Standardwert Das Timeout ist nicht anwendbar (Standard). Versucht, ausstehende Daten zu senden, bis das Standardmäßige IP-Protokolltimeout abläuft.
true (aktiviert) Timeout ungleich Null Versucht, ausstehende Daten zu senden, bis das angegebene Timeout abläuft. Wenn der Versuch fehlschlägt, setzt Winsock die Verbindung zurück.
true (aktiviert) Ein Nulltimeout. Verwirft alle ausstehenden Daten. Für verbindungsorientierte Sockets (z. B. TCP) setzt Winsock die Verbindung zurück.

Der IP-Stapel berechnet den Standardtimeoutzeitraum für das IP-Protokoll, das basierend auf der Roundtripzeit der Verbindung verwendet werden soll. In den meisten Fällen ist das vom Stapel berechnete Timeout relevanter als das, das von einer Anwendung definiert wird. Dies ist das Standardverhalten für einen Socket, wenn die LingerState Eigenschaft nicht festgelegt ist.

Wenn die LingerTime in der LingerState Eigenschaft gespeicherte Eigenschaft größer als das Standardtimeout des IP-Protokolls festgelegt ist, wird das Standardzeitlimit des IP-Protokolls weiterhin angewendet und überschrieben.

Gilt für: