4 Stimmen

Wie eine getrennte Steckdose C# zu erkennen?

Ich habe an einem Socket-Client-Programm in C# gearbeitet und frage mich, wie man erkennen kann, wenn das andere Ende eines Sockets sich "ungracefully" getrennt hat, z. B. wenn ein Netzwerkkabel abgezogen oder ein Hard Reset durchgeführt wurde.

Ich habe diese Funktionen unten, um die Steckdose zugreifen und nach der SO Frage aquí und dies MSDN-Artikel Der beste Weg, um zu prüfen, ob ein Socket getrennt wurde, besteht darin, eine 1-Byte-Nachricht mit einer Länge von 0 zu senden. Wenn eine Ausnahme ausgelöst wird und WSAEWOULDBLOCK nicht der Fehlercode ist, ist der Socket getrennt. Ich habe dies versucht, aber nachdem ich die Serververbindung zurückgesetzt habe, ruft der Client Send(new byte[1], 0, 0, SocketFlags.None) und erfolgreich zurückkehren und die Receive() Befehl gleich danach den Fehler WSAEWOULDBLOCK zurück.

Was ist los?

Hier ist mein Code unten. _socket ist auf den nicht blockierenden Modus eingestellt:

private int nonBlockRecv(byte[] recvBytes, int offset, int size, SocketFlags sf)
{
    int bytesRecv = 0;

    while (true)
    {
        try
        {
            nonBlockSend(new byte[1], 0, 0, sf);
            bytesRecv = _socket.Receive(recvBytes, offset, size, sf);
            break;
        }
        catch (SocketException excp)
        {
            if (excp.ErrorCode != 10035) // WSAEWOULDBLOCK
                throw excp;
        }
    }

    return bytesRecv;
}

private int nonBlockSend(byte[] sendBytes, int offset, int size, SocketFlags sf)
{
    int bytesSent = 0;

    while (true)
    {
        try
        {
            _socket.Send(sendBytes, offset, size, sf);
            break;
        }
        catch (SocketException excp)
        {
            if (excp.ErrorCode != 10035) // WSAEWOULDBLOCK
                throw excp;
        }
    }

    return bytesSent;
}

Bearbeiten: Dies kann von Vorteil sein, aber der Server ist ein Windows Mobile-Gerät. Ich habe in einem anderen Thread gelesen, dass verschiedene Betriebssysteme in der Lage sein könnten, Socket-Close-Signale zu senden, wenn sie sterben. Vielleicht das Windows Mobile OS nicht tun dies??

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X